gpt4 book ai didi

c - 管道(), fork ();执行();我寻找与 bash 相同的行为 `cat | ls`

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

我在下面的代码中,我正在寻找与 cat | ls 相同的行为在bash中。但在我的程序中, fork 为 cat在我发送给他之前不会结束ctrl+D .

我根本不明白为什么要附加。当我 dup2()进入 child 的,效果很好,但我想要我的 dup2()调用在父程序中。

在父级中每次使用后,我都会正确地关闭管道 fd,并在第一个子级中关闭未使用的 fd

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/wait.h>


int save_and_restore_fd(int action)
{
static int fds[3] = {-1};

if (action == 0) //Save stdin/out/err
{
fds[STDIN_FILENO] = dup(STDIN_FILENO);
fds[STDOUT_FILENO] = dup(STDOUT_FILENO);
fds[STDERR_FILENO] = dup(STDERR_FILENO);
}
else if (action == 1) //Restore stdin/out/err
{
dup2(fds[STDIN_FILENO], STDIN_FILENO);
close(fds[STDIN_FILENO]);
dup2(fds[STDOUT_FILENO], STDOUT_FILENO);
close(fds[STDOUT_FILENO]);
dup2(fds[STDERR_FILENO], STDERR_FILENO);
close(fds[STDERR_FILENO]);
}

return (1);
}

int main()
{
int fds[2];
char *args1[2] = {"/bin/cat", NULL};
char *args2[2] = {"/bin/ls", NULL};

pipe(fds); //Open pipe
save_and_restore_fd(0); //save stdin/out/err

dup2(fds[1], STDOUT_FILENO);
close(fds[1]);

if (fork() == 0) //Execute cat into a child
{
close(fds[0]);
execve("/bin/cat", args1, NULL);
}
save_and_restore_fd(1); //load stdin/out/err

dup2(fds[0], STDIN_FILENO);
close(fds[0]);

save_and_restore_fd(0); //save stdin/out/err
if (fork() == 0) //Execute ls into a child
{
execve("/bin/ls", args2, NULL);
}
save_and_restore_fd(1); //load stdin/out/err
while (wait(NULL) > 0); //Wait all child end
return (0);
}```

最佳答案

我找到了解决方案。就在我的 wait 循环之前,我需要关闭 stdin。第一个 fork 中的 cat 使用原始的 stdin,然后我需要关闭它,让 cat 自行结束。

关于c - 管道(), fork ();执行();我寻找与 bash 相同的行为 `cat | ls`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59690655/

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