gpt4 book ai didi

c - 管道 & 执行 & C

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

您好,我遇到以下问题,我必须创建一个程序来执行这些 Linux 命令 ls –la |排序| wc –l 但在我的代码中我只能读取这个命令中的两个,sameone 可以帮助我吗??

int main(){
pid_t pids[3];
int dados[2],dados2[2],i;

if(pipe(dados) == -1 && pipe(dados2) == -1){
perror("pipe failed");
exit(1);
}

for(i=0;i<3;i++){
pids[i] = fork();
if(pids[i] == 0){
if(i==0){
close(dados[0]);
dup2(dados[1],1);
close(dados[1]);

execlp("ls","ls","-la",NULL);
perror("exec failed");
exit(-1);
}
if(i==1){
close(dados[1]);
dup2(dados[0],0);
close(dados[0]);


close(dados2[0]);
dup2(dados2[1],1);
close(dados2[1]);

execlp("sort","sort",NULL);
perror("exec failed");
exit(-1);
}else{
close(dados2[1]);
dup2(dados2[0],0);
close(dados2[0]);
printf("aaaaaaaaaaaaaaaaaa");
execlp("wc","wc","-l",NULL);
perror("exec failed");
exit(-1);
}
}
}

/* Pai tem de fechar a sua copia da extremidade de escrita
para a leitura do sort desbloquear */
close(dados[1]);
close(dados2[0]);
for(i=0;i<3;i++){
wait(NULL);
}

return 0;

}

我不明白这其中遗漏了什么

最佳答案

立即引起我注意的是

-if(pipe(dados) == -1 && pipe(dados2) == -1){
+if(pipe(dados) == -1 || pipe(dados2) == -1){

perror("pipe failed");
exit(1);
}

父进程pid只需要读取最后一个命令的输出,因此父进程需要关闭所有其他管道末端。子进程需要关闭 stdin/stdout 和 dup2() 管道描述符以将它们绑定(bind)到 stdin/stdout,然后执行 exec()。对于管道,关闭过程中不需要的管端非常重要。请参阅http://linux.die.net/man/2/pipe

目前我手边没有 Linux 机器,所以我无法编写和测试 Linux 代码。

我给你的总结是:- 父级从最后一个管道读取(链中最后一个进程的标准输出)- 所有其他 child 需要 close() 他们的 stdin/stdout,dup2() 正确的管道,关闭所有不需要的管道(记住也关闭 dup2() 源,因为它是一个 fd),然后执行。

这是我如何创建管道并重新绑定(bind) fds 的示例。

// unset FD_CLOEXEC
set_close_on_exec(to_child,false);
set_close_on_exec(from_child, false);

// close and rebind the stdin/stdout/stderr
// dup the fd and recreate stdin/stdout with fd as the target
if (dup2(to_child, STDIN_FILENO) != 0 || dup2(from_child, STDOUT_FILENO) != 1) {
shared::perror("error duplicating socket for stdin/stdout");
exit(EXIT_FAILURE);
}

// close these FDs
close(to_child);
close(from_child);

// now we can exec the new sub process and talk to it through
// stdin/stdout/stderr
execlp(exe.c_str(), exe.c_str(), argv.c_str(), (char*)0);

// this should never be reached
shared::perror("error: executing the binary: " + exe);
exit(EXIT_FAILURE);

请记住,在 pipeline(int fds[2]) 处,索引 1 是管道的写入端,索引 0 是管道的读取端。所以你需要

问候格奥尔格

编辑:我向您推荐这本书《Linux 编程接口(interface):Linux 和 UNIX 系统编程手册》ISBN-13:978-1593272203

关于c - 管道 & 执行 & C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29358916/

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