我试图建立一个程序,其中一个进程建立一个管道,然后传递给它的子进行读取或写入。我尝试使用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]);
答案 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中。孩子,如其他相关问题所示: