Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C forks和pipes实现linux编译器_C_Linux_Fork_Pipe - Fatal编程技术网

C forks和pipes实现linux编译器

C forks和pipes实现linux编译器,c,linux,fork,pipe,C,Linux,Fork,Pipe,以下代码取自的 #包括 #包括 #包括 内部主(空) { int-pfds[2]; 管道(pfds); 如果(!fork()){ 关闭(1);/*关闭正常标准输出*/ dup(pfds[1]);/*使标准输出与pfds[1]相同*/ 关闭(pfds[0]);/*我们不需要这个*/ execlp(“ls”、“ls”、NULL); }否则{ 关闭(0);/*关闭正常标准*/ dup(pfds[0]);/*使标准DIN与pfds[0]相同*/ 关闭(pfds[1]);/*我们不需要这个*/ execl

以下代码取自的

#包括
#包括
#包括
内部主(空)
{
int-pfds[2];
管道(pfds);
如果(!fork()){
关闭(1);/*关闭正常标准输出*/
dup(pfds[1]);/*使标准输出与pfds[1]相同*/
关闭(pfds[0]);/*我们不需要这个*/
execlp(“ls”、“ls”、NULL);
}否则{
关闭(0);/*关闭正常标准*/
dup(pfds[0]);/*使标准DIN与pfds[0]相同*/
关闭(pfds[1]);/*我们不需要这个*/
execlp(“wc”、“wc”、“-l”、NULL);
}
返回0;
}

此代码允许用户查看特定目录中有多少文件。如何编辑此代码以实现较长的管道
cat/etc/passwd | cut–f1–d:| sort
?有人知道怎么做吗,因为我完全被卡住了。任何帮助都将不胜感激。

感觉像是家庭作业,所以我给你一些建议:

  • 较长的管道有两个管道,因此需要调用pipe()两次。(我也会检查管道的返回值,而我是在它。)

  • 有三个过程,即两个分叉。再次,正确地检查fork()的返回值:它是三种状态:父、子或失败,您的程序应该测试这三种情况

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

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

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

您需要(取决于命令列表的长度)一些管道。但是,在最大的情况下,在中间的过程中,您不需要超过两个管道对FDS,因为第一个和最后一个需要一对管道FDS。确实要确保关闭不需要的管道FD——如果不需要,子进程可能不会获得EOF,也永远不会完成

和(如user3392484所述):检查所有系统调用是否存在错误条件,并将其报告给调用方。这将使生活更轻松

我在过去的几天里实现了类似的东西,也许你想看看:

亲切问候-安德烈亚斯

可能的副本
#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;
}