gpt4 book ai didi

c - 厕所 : standard input: Bad file descriptor on fork + pipe + execlp

转载 作者:太空宇宙 更新时间:2023-11-04 08:13:16 26 4
gpt4 key购买 nike

我知道这是一个简单的练习,但我遇到了麻烦。我正在尝试模仿:

grep arg1 arg2 | wc -l

我收到以下错误:“wc:标准输入:执行时文件描述符错误”。这是我的代码:

int main(int argc, char *argv[])
{
if (argc != 3) usage();
int pd[2]; //Pipe descriptor
pipe(pd);
int pid = fork();
if (pid < 0) perror("Something failed on trying to create a child process!\n");
else if (pid == 0) { //Child
dup2(pd[1], 0);
close(pd[0]);
close(pd[1]);
execlp("wc", "wc", "-l", (char *)NULL);
} else { //Parent
dup2(pd[0], 1);
close(pd[0]);
close(pd[1]);
execlp("grep", "grep", argv[1], argv[2], (char *)NULL);
}
}

可能是什么问题?

最佳答案

你有:

else if (pid == 0) { //Child
dup2(pd[1], 0);
close(pd[0]);
close(pd[1]);
execlp("wc", "wc", "-l", (char *)NULL);
}

你需要:

else if (pid == 0) { //Child
dup2(pd[0], 0);
close(pd[0]);
close(pd[1]);
execlp("wc", "wc", "-l", (char *)NULL);
fprintf(stderr, "Failed to execute 'wc'\n");
exit(1);
}

关键的变化是dup2();您的代码将管道的写入端复制到 child 的标准输入,这不是幸福的秘诀。修改后的代码将管道的读取端复制到 child 的标准输入。很容易记住哪个是哪个:stdin 是文件描述符 0 和管道描述符 0 是输入描述符(管道的读取端),而 stdout 是文件描述符 1 和管道描述符 1 是输出描述符(写管道的末端)。

您需要在“父”代码中进行相反的更改。

wc 试图从一个只为写入而打开的文件描述符中读取时,会出现错误。

请注意,如果 execlp() — 或 exec*() 函数系列的任何其他成员 — 返回,则失败。处理该错误很重要,通常通过在标准错误上报告问题并退出。 exec*() 操作后没有语句很少是正确的。

关于c - 厕所 : standard input: Bad file descriptor on fork + pipe + execlp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37603297/

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