从管道读取时进程暂停 - linux

时间:2014-05-02 13:33:16

标签: c linux posix pipe

我已经写了以下代码:

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include <sys/types.h>
#include <sys/wait.h>

#define BUFF 200


int main(int argc, char *argv[]) {

    char write_buffer[BUFF];
    char read_buffer[BUFF];

    strcpy(write_buffer, "This string supposed to be sent from parent to child");

    int fds[2];
    pid_t pid;

    if ((pid=fork())==-1) {
        perror("fork error");
    }

    if (pipe(fds)==-1) {
        perror("pipe error");
    }


    else if (pid==0) { // child


        int bytes;
        if ((bytes=read(fds[0], read_buffer, BUFF))==-1) {
            perror("read error");
        }
        else {
            printf("read %d bytes from pipe\n", bytes);
        }
    }

    else { // parent

        if (write(fds[1], write_buffer, strlen(write_buffer))==-1) {
            perror("write error");
        }

        printf("FLAG to check if write() went through\n"); // this will print!

        wait(NULL);
    }
}

上面的简单代码是尝试通过管道从父进程发送数据到子进程 问题是,执行因某种原因暂停......
子进程在read()系统调用中被阻塞(或者至少看起来是这样),父进程就坐在那里,等待它完成,但这种情况从未发生过。
这里有什么问题?显然,父进程有足够的时间将write_buffer写入管道,因此子进程不会在空管道上调用read()。

1 个答案:

答案 0 :(得分:3)

fork然后创建管道,这样每个流程都会转到自己的一组管道,而这些管道彼此之间并不相互通信。

只需切换代码并在pipe之前致电fork,您就应该好了。

此外,虽然它可能在这里不重要,但养成了循环阅读和写作的习惯。 read&amp; write无法保证在一次通话中获取或放置您请求的所有数据。同样,完成后关闭管道。关闭管道的写入端将向读者发出已到达文件结尾的信号。

while (read(fds[0], read_buffer, sizeof(read_buffer)) > 0) 
{
    //process bytes read
}