gpt4 book ai didi

c - execl() 似乎没有从标准输入中读取

转载 作者:太空宇宙 更新时间:2023-11-03 23:23:00 25 4
gpt4 key购买 nike

我正在尝试用 C 语言重现此命令:

ls | wc > output.txt

因此,为此,我编写了以下程序:

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

int main()
{
pid_t lsFork, wcFork;
int tube[2];
pipe(tube);

lsFork = fork();
if(lsFork == 0) // ls command
{
close(tube[0]);
dup2(tube[1], STDOUT_FILENO);
close(tube[1]);
if(execl("/usr/bin/ls", "ls", NULL) == -1)
perror("Cannot execute ls");
}
else
{
wcFork = fork();
if(wcFork == 0) // wc command
{
sleep(1);
int file = open("output.txt", O_WRONLY | O_CREAT);
if(file == -1)
perror("Cannot open output.txt");

close(tube[1]);
dup2(tube[0], STDIN_FILENO);
close(tube[0]);
dup2(file, STDOUT_FILENO);
close(file);

/*char buffer[BUFSIZ];
read(STDIN_FILENO, buffer, BUFSIZ);
write(STDOUT_FILENO, buffer, BUFSIZ);*/

if(execl("/usr/bin/wc", "wc", NULL) == -1)
perror("Cannot execute wc");

close(STDOUT_FILENO);
}
else // parent
{
int status;
waitpid(lsFork, &status, 0);
waitpid(wcFork, &status, 0);
}
}

return EXIT_SUCCESS;
}

但是,程序并没有退出。根据 htop,wc 命令正在阻止程序。为了理解这种行为,我写了一段代码(在 execl() 之前注释的行),但我不明白这是什么工作而不是 execl()。调用此函数时我是否忘记了什么?

最佳答案

父进程仍然打开管道,所以 wc 正在等待,以防父进程决定写入内容(wc 需要计数)。

也关闭父管道的两端:

    else // parent
{
int status;
close(tube[0]); // <---
close(tube[1]); // <---
waitpid(lsFork, &status, 0);
waitpid(wcFork, &status, 0);
}

关于c - execl() 似乎没有从标准输入中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34302259/

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