gpt4 book ai didi

c - 如何将管道从父进程发送到子进程

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

我正在尝试使用 fork 创建三个子进程,其中两个会将字符字符串写入管道,第三个将从 pipr 读取它并将其输出到屏幕上。我们应该创建 4 个文件并调用 exec 系统调用来访问这些文件。但我不知道如何将管道发送到其他进程。由于我尝试在主进程中创建 fd[2] 和 pipeline(fd) 在子进程中调用 close(fd[0]) ,但它给了我未声明的?我怎么能这样做呢。这是我的代码

   int main(void){
int fd[2],z,status,i;
pid_t childB, childC, childD;
char *arg[1] = {0};
z = pipe(fd);
if(z <0 ){perror("create pipe"); exit(0);}

childB = fork();
if(childB==0){execv("PipeW1",arg);}
if(childB<0){printf("fork failed\n");exit(0);}
....

在 PipeW1 方法中,我这样做了:

    void main (int argc, char *argv[]){
int i;
char str[6];
close(fd[0]);
for(i=1;i<=500;i++){
sprintf(str,"%03daaa",i);
z = write(fd[1],str,6);
if(z<0) {perror("write process B"); exit(1);}
if(i%100==0){usleep(100000);}
}
close(fd[1]);
exit(0);
}

任何建议都会有帮助!

谢谢

最佳答案

管道通过 execve 保持打开状态 - 但您不能在另一个程序中使用在一个程序中声明的变量 (fd[]),它不仅在不同的 C 作用域(编译单元)中,而且是完全不同的/进程镜像/。

但是,数值将保留 - 这是标识管道的内容。因此,将代表管道“读取”端的数字 fd[0] 传递给子进程。通常使用 fork() 是很自然的,但既然你执行了 exec(),最好的方法是将数字 fd[0] 作为命令行参数传递到 argv[] 数组中。请注意,这将是一个字符串,因此您需要使用 snprintf() 之类的东西来创建参数。

关于c - 如何将管道从父进程发送到子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29618839/

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