在过程中写一些东西,然后在另一个过程中阅读

时间:2017-11-09 08:04:56

标签: c fork

我想在进程A中编写一些内容并在进程B中读取它,该进程是由A分叉的。但是我发现除非A终止,否则B无法读取内容。如果在没有退出的情况下在B中读取,我如何在进程A中编写?我的代码如下。

#include <stdio.h>
#include <unistd.h>

int mypipe[2];

int main(){
    FILE* f;
    pid_t pid = 0;
    int num = 0, temp;

    pipe(mypipe);

    pid = fork();

    if (pid == (pid_t)0){
        f = fdopen(mypipe[0], "r");
        while (1){
            fscanf(f, "%d", &temp);
            printf("from child: %d\n", temp);
        }
        fclose(f);
    }
    else{
        f = fdopen(mypipe[1], "w");
        while (1){
            scanf("%d", &num);
            fprintf(f, "%d\n", num);
            //break;
        }
        fclose(f);
    }

    return 0;
}

2 个答案:

答案 0 :(得分:2)

  

除非A终止,否则B无法读取内容

这是因为A实际上没有写东西。 stdio个流(由FILE *表示)被缓冲。您可以使用setvbuf()设置缓冲模式。默认情况下,使用fdopen()在管道上打开的流将完全缓冲,因此在缓冲区已满之前不会对管道进行实际写入。

最简单的解决方案是在您希望写入的任何地方调用代码fflush(),例如:在fprintf()

之后的代码中
    while (1){
        scanf("%d", &num);
        fprintf(f, "%d\n", num);
        fflush(f);
        //break;
    }

答案 1 :(得分:0)

首先,代码中有许多不必要的行。您可以直接使用read()和write()系统调用,而不是执行fdopen()。其次fork()系统调用返回0到子进程并将子进程的pid返回给父进程。最后,父母应该等待孩子完成并从记忆中清除它以阻止它变成僵尸。

这是您的代码的更正版本可以完美无损地运行。

viewBox

阅读系统调用手册页 男人2读,男人2写等。