C语言 通过 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]);

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

关于你的段错误,你这样声明 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,如另一个相关问题所示:

管道、叉子、dup2 有问题

最新更新