gpt4 book ai didi

c - forks和pipes实现linux编译器

转载 作者:行者123 更新时间:2023-11-30 17:37:14 26 4
gpt4 key购买 nike

我有以下代码取自 “Pipes” sectionBeej’s Guide to Unix IPC .

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
int pfds[2];

pipe(pfds);

if (!fork()) {
close(1); /* close normal stdout */
dup(pfds[1]); /* make stdout same as pfds[1] */
close(pfds[0]); /* we don't need this */
execlp("ls", "ls", NULL);
} else {
close(0); /* close normal stdin */
dup(pfds[0]); /* make stdin same as pfds[0] */
close(pfds[1]); /* we don't need this */
execlp("wc", "wc", "-l", NULL);
}

return 0;
}

此代码允许用户查看特定目录中有多少个文件。如何编辑此代码以实现更长的管道 cat/etc/passwd |剪切 –f1 –d: |排序?有谁知道如何做到这一点,因为我完全陷入困境。任何帮助将不胜感激。

最佳答案

感觉像是家庭作业,所以我只是给你一些指导:

  • 较长的管道有两个管道,因此您需要调用 pipeline() 两次。 (我还会检查管道的返回值。)

  • 共有三个进程,这意味着两个 fork 。再次,正确检查 fork() 的返回值:它具有三态:父级、子级或失败,并且您的程序应该测试所有三种情况。

  • 如果您预先调用两次 pipeline(),请仔细考虑每个进程中的哪些文件描述符(即管道的哪一端),以及在调用 execlp() 之前要关闭哪些文件描述符。我会画一幅画。

  • 我更喜欢 dup2() 而不是 dup(),因为您显式设置了目标文件描述符,因此在调用中指定它是有意义的。还可以避免愚蠢的错误。

  • dup 和 execlp 可能会失败,所以我也会检查它们的返回值...

关于c - forks和pipes实现linux编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22464543/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com