【问题标题】:Interprocess Communication with pipe and file管道和文件的进程间通信
【发布时间】:2016-04-22 21:34:58
【问题描述】:

我正在使用 linux 作为操作系统,并尝试使用管道和文件通信三个进程。它应该适用于放在 STDIN 上的任何文件。 管道工作得很好,但是第二个进程无法将一个字符正确写入文件或第三个读取。 首先,当然我将函数初始化为 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);
}

【问题讨论】:

    标签: linux pipe fork ipc


    【解决方案1】:

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

    然后您将关闭第二个子进程中的 mypipe[1],因为它是一个分叉副本,因此不会关闭第一个子进程中的管道。您还尝试编写 BUFSIZ 字符,因此您似乎试图写出比写入更多的字符,请尝试“write (mypipe[1], &d, strlen(d));”。

    在字符读/写循环中包含 fopen() 和 fclose() 看起来很奇怪。您真的想一遍又一遍地重新打开并重新写入文件中的 1 个字符吗?

    类似地,process2 文件似乎被重新打开,因此如果其中的第一个字符不是空的,它将一次又一次地写入。

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

    【讨论】:

    • 哦,我并不是要气馁,起初 fork() 和管道一定很奇怪 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2010-09-26
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多