通过argv传递管道地址

时间:2015-04-14 19:02:30

标签: c pipe exec argv

我试图建立一个程序,其中一个进程建立一个管道,然后传递给它的子进行读取或写入。我尝试使用argv参数来传达管道的地址以供孩子们使用,但是我做错了并且在我尝试运行时遇到分段错误

父:

void main(int argc, char *argv [ ]){
int temp,B,C,D,num; char *arg[1]={0};

int fd[2];
pipe(fd);
B=1;
C=1;
D=1;
sprintf(arg[0], "%d", fd);

B=fork();
if (B==0){execv("PipeW1", arg);}

C=fork();
if (C==0){execv("PipeW2", arg);}

D=fork();
if (D==0){execv("PipeR", arg);}

儿童

void main(int argc, char *argv [ ]){
int *fd = atoi(argv[0]);
//pipe(fd);
close(fd[1]);

2 个答案:

答案 0 :(得分:0)

对于一个,argv[0]将是您的可执行文件的名称,第一个“真实”参数将在argv[1]中。在argv数组中访问它们之前,检查是否有适当数量的参数可能是个好主意。
另一件事是你的子进程中你应该将fd初始化为int而不是int的指针。
第三个问题可能是close(fd[1])你在fd中将fd视为数组事实上它是一个标量整数值。
对你孩子过程中可能存在的问题这么多...

答案 1 :(得分:0)

关于你的段错误,你宣布arg是这样的:

char *arg[1]={0};

这意味着arg [0]是一个空指针,因此在sprintf(arg [0],...)时会出现段错误。

首先尝试为它分配一些内存。由于您正在打印一个小整数的文件描述符,因此您不需要太多,可能需要2个字节的数字加上另一个字节的nul终结符。然后使用snprintf()而不是sprintf()来确保如果由于某种原因你的文件描述符有三位数字,那么你就不要过去了:

arg[0] = malloc(3);
snprintf(arg[0], 3, "%d", fd);

然后当你完成所有操作时,不要忘记free(arg[0]);

编辑:

至于你问题的另一部分,你实际上可能最好不要把文件描述符作为字符串传递,只需使用dup2(2)将管道描述符映射到stdin / stdout中。孩子,如其他相关问题所示:

Having issues with pipe, fork, dup2