嗨,我的 c 程序遇到了一些问题。目标是fork
两次,然后将一些带有pipe
的数据从子项 2 传递到子项 1,然后将一些不同的数据从子项 1 传递到父项,最后在父级中打印出来。这是我的代码:
int main(void)
{
int f,f2,nread;
int pfd[2], pfd2[2];
char buffer[512], *str;
if(pipe(pfd)==-1) {
errorHandler("pipe");
}
if((f=fork())==-1) {
errorHandler("fork 1");
} else if(f == 0) {
/*child 1*/
if(pipe(pfd2)==-1) {
errorHandler("pipe 2");
}
if((f2=fork())==-1) {
errorHandler("fork 2");
} else if(f2 == 0) {
/*child 2*/
close(pfd[0]);
close(pfd[1]);
close(pfd2[0]);
str = "rollin";
printf("-child 2 writing: %sn", str);
if(write(pfd2[1], &str, BUFFSIZE)==-1) {
errorHandler("write 2");
}
} else {
/*child 1*/
close(pfd[0]);
close(pfd2[1]);
if((nread=read(pfd2[0], &buffer, 512))==-1) {
errorHandler("read child 1");
}
buffer[nread] = 0;
printf("child 1 read data %d [%s]n", nread, buffer);
str = "patrollin patrolling hehe";
printf("-child 1 writing %sn", str);
if(write(pfd[1], &str, BUFFSIZE)==-1) {
errorHandler("write");
}
}
} else {
/*parent*/
close(pfd[1]);
if((nread=read(pfd[0], buffer, sizeof(buffer)))==-1) {
errorHandler("read");
} else {
buffer[nread] = 0;
printf("parent read data: %d [%s]n", nread, buffer);
}
}
return 0;
}
输出是读取数据(我指定的 512 字节(,但这不是我发送的。我从内存中获取一些随机符号(文件描述符正确传递,对吧?我来这里的原因是我无法弄清楚这有什么问题。我有一个只有一个分支和类似操作的程序,它基于相同的技术并且正在工作。谁能给我一个提示,我做错了什么?
read
的第二个参数是指向缓冲区的指针。要write
的第二个参数是指向要写入的数据的指针。所以你应该使用
read(pfd2[0], buffer, 512)
和
write(pfd2[1], str, BUFFSIZE)