c fork pipe和read fucntion从文件描述符中提供随机字节

时间:2016-04-13 13:58:37

标签: c linux pipe fork

您好我的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: %s\n", 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 %s\n", 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字节),但它不是我发送的。我从内存中取一些随机的符号(文件描述符正确传递,对吧?)。 我来这里的原因是我无法弄清楚这有什么问题。我有一个程序,只有一个fork和类似的动作,它基于相同的技术,它正在工作。谁能给我一个暗示我做错了什么?

1 个答案:

答案 0 :(得分:0)

read的第二个参数是指向缓冲区的指针。 write的第二个参数是指向要写入的数据的指针。所以你应该使用

read(pfd2[0], buffer, 512)

write(pfd2[1], str, BUFFSIZE)