我对C很陌生,正在尝试学习如何在Unix环境中使用管道将数据从父进程传输到子进程,反之亦然。在下面的代码中,我接收到一个命令行参数,并基于该参数的值构建一个char数组。然后我使用管道将char数组传递给一个将执行一个名为vc的程序的子对象。这个程序根据char数组返回一个数字结果。我的问题是如何使用第二个管道将结果返回给父级?而且,一旦父级拥有它,我如何将它打印到屏幕上,因为父级设置为将输出发送给子级?谢谢您。#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/wait.h>int main(int argc,char *argv[]){ int pfildes[2], pid, argNumber; char buffer[256], charString[1024]; //Check for arguments if(argc != 2) { printf("No command line arguements given.\n"); argNumber=10; //default } else argNumber=atoi(argv[1]); //*********************************** //Build charString based on argNumber //*********************************** //create pipes if(pipe(pfildes) == -1) { //error occured when creating pipe perror("demo"); exit(1); } //create child process if((pid=fork()) < 0) { //error occured when forking child perror("demo"); exit(1); } else if(pid > 0) { //parent process close(pfildes[0]); dup2(pfildes[1],1); printf("%s", charString); close(pfildes[1]); perror("demo"); _exit(1); } else { //child process close(pfildes[1]); dup2(pfildes[0],0); execlp("/usr/bin/vc","vc", NULL); close(pfildes[0]); perror("demo"); exit(1); } while(wait(NULL) >0); return 0;} 最佳答案 您可以使用socketpair()而不是pipe()在父进程和子进程之间生成双向通信通道://...if (socketpair(PF_UNIX, SOCK_STREAM, 0, pfildes) == -1) { //error occured when socket pair perror("demo: socketpair"); exit(1);}//..在子进程中,可以在调用dup()之前将一对输入和输出输入到exec()中://...else { //child process close(pfildes[1]); dup2(pfildes[0],0); dup2(pfildes[0],1); dup2(pfildes[0],2); close(pfildes[0]); execlp("/usr/bin/vc","vc", NULL); perror("demo: child exec"); exit(1);}//...在父进程中,您可以使用文件>从文件描述符创建一个 >,因此您不需要在您的现有文件描述符上添加 >://...else if(pid > 0) { //parent process close(pfildes[0]); FILE *to_child = fdopen(dup(pfildes[1]), "w"); FILE *from_child = fdopen(dup(pfildes[1]), "r"); close(pfildes[1]); fprintf(to_child, "%s", charString); while (fgets(buf, sizeof(buf), from_child) != NULL) { //...do something with output } //...} else { //...关于c - 通过Unix C将数据从父级传递到子级并返回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18728956/
10-10 14:12