进程间与管道和文件的通信

时间:2016-01-17 19:09:25

标签: linux pipe fork ipc

我使用linux作为操作系统并尝试使用管道和文件来传达三个进程。它应该适用于STDIN上的任何文件。 并且管道工作得很好,但第二个进程无法将一个char正确写入文件或第三个读取。 首先当然我初始化函数作为semlock和semunlock和开放管道也在那里。我感谢任何帮助,因为我不知道。

if (!(PID[1] = fork ())) {

    int BUF_SIZE = 4096;
    char d[BUF_SIZE];

    while (fgets (d, BUF_SIZE, stdin) != NULL) {
        write (mypipe[1], &d, BUF_SIZE);
    }
}

if (!(PID[2] = fork ())) {

    int reading_size = 0;
    char r;

    close (mypipe[1]);
    semlock (semid1);
    while (reading_size = read (mypipe[0], &r, 1)) {

        if ((file = fopen ("proces2.txt", "w")) == NULL) {
            warn ("error !!!");
            exit (1);
        }
        fputc (r, file);
        fclose (file);
        semunlock (semid2);
    }
}

if (!(PID[3] = fork ())) {
    char x;

    semlock (semid2);
    do {
        if ((plikProces3 = fopen ("proces2.txt", "r")) == NULL) {
            warn ("Blad przy otwarciu pliku do odczytu !!!");
            exit (1);
        }

        i = getc (plikProces3);
        o = fprintf (stdout, "%c", i);
        fclose (plikProces3);
        semunlock (semid1);
    } while (i != EOF);
}

1 个答案:

答案 0 :(得分:1)

是什么让你认为孩子先跑?您还没有等待子进程完成,因此可以在上一个孩子写完之前点击EOF读取文件。最后一个fork()调用是不是等待,所以你知道文件是写的吗?目前,您有4个流程,而不是3个!!

然后你在第二个子进程中关闭mypipe [1],因为它是一个分叉副本,不会关闭第一个子进程中的管道。你也试图写BUFSIZ字符,所以你似乎试图写出比写的更多的字符,试试"写(mypipe [1],& d,strlen(d));"

看起来很奇怪,拥有fopen()&字符读/写循环中的fclose()。你真的想重新开放&一遍又一遍地将1个字符重写到文件中?

类似地,process2文件似乎被重新打开,因此如果它是非空的,则会反复写入第一个字符。

肯定会有其他错误,但这对你现在应该有所帮助。