gpt4 book ai didi

经典 C. 在 execvp 函数、stdin 和 stdout 重定向中使用管道

转载 作者:太空狗 更新时间:2023-10-29 17:14:29 36 4
gpt4 key购买 nike

我想在我的 Linux C 程序中使用管道和 execvp 函数模拟 bash。例如

ls -l | wc -l  

这是我的程序:

if(pipe(des_p) == -1) {perror("Failed to create pipe");}

if(fork() == 0) { //first fork
close(1); //closing stdout
dup(des_p[1]); //replacing stdout with pipe write
close(des_p[0]); //closing pipe read
close(des_p[1]); //closing pipe write

if(execvp(bash_args[0], bash_args)) // contains ls -l
/* error checking */
}
else {
if(fork() == 0) { //creating 2nd child
close(0); //closing stdin
dup(des_p[0]); //replacing stdin with pipe read
close(des_p[1]); //closing pipe write
close(des_p[0]); //closing pipe read

if(execvp(bash_args[another_place], bash_args)) //contains wc -l
/* error checking */
}

close(des_p[0]);
close(des_p[1]);
wait(0);
wait(0);
}

此代码实际运行,但没有做正确的事情。这段代码有什么问题?那行不通,我不知道为什么。

最佳答案

您需要关闭父级中的管道 fds,否则子级将不会收到 EOF,因为管道在父级中仍处于打开状态以供写入。这将导致第二个 wait() 挂起。对我有用:

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


int main(int argc, char** argv)
{
int des_p[2];
if(pipe(des_p) == -1) {
perror("Pipe failed");
exit(1);
}

if(fork() == 0) //first fork
{
close(STDOUT_FILENO); //closing stdout
dup(des_p[1]); //replacing stdout with pipe write
close(des_p[0]); //closing pipe read
close(des_p[1]);

const char* prog1[] = { "ls", "-l", 0};
execvp(prog1[0], prog1);
perror("execvp of ls failed");
exit(1);
}

if(fork() == 0) //creating 2nd child
{
close(STDIN_FILENO); //closing stdin
dup(des_p[0]); //replacing stdin with pipe read
close(des_p[1]); //closing pipe write
close(des_p[0]);

const char* prog2[] = { "wc", "-l", 0};
execvp(prog2[0], prog2);
perror("execvp of wc failed");
exit(1);
}

close(des_p[0]);
close(des_p[1]);
wait(0);
wait(0);
return 0;
}

关于经典 C. 在 execvp 函数、stdin 和 stdout 重定向中使用管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13801175/

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