【问题标题】:Understanding the lifeline of linux pipe for ipc communication了解ipc通信的linux管道生命线
【发布时间】:2014-11-29 14:42:38
【问题描述】:

我想了解管道的使用寿命? http://linux.die.net/man/2/pipe

  1. 如果发送方或接收方死亡/退出,管道中的数据是否仍然有效?
  2. 如果接收器不存在,是否可以创建管道? (即尚未分叉)?

我需要将数据从发送方发送到接收方。但是,接收者可能还没有被分叉,并且可能在大约(发送者之后 1~2 秒)处于活动状态。它们共享父进程,但接收者可能会在发送者之后的某个时间点被分叉,反之亦然。

发件人也有可能随时完成处理并退出。 我正在尝试查看使用管道而不是共享内存队列是否对我有用。

【问题讨论】:

    标签: linux pipe ipc


    【解决方案1】:

    必须在分叉之前创建管道。在分叉之后,每个进程都使用读端或写端。最好在分叉后立即关闭管道未使用的一端。

    如果写入过程退出,读取器可以read管道中的所有剩余数据,但随后的read系统调用返回读取0字节,这就是你知道它结束的方式。如果写入过程仍然保持管道打开但没有向其中写入任何内容,read 会阻塞直到字节可用。

    如果写入过程已经将大量数据写入管道并退出,数据仍然可供阅读器使用。

    如果读取进程退出,写入进程会被 SIGPIPE 信号终止。它可以选择以不同的方式处理信号,但默认情况下会被终止。

    所以管道可能会在作者中存活下来,但不是读者。概念证明(cső 是匈牙利语的管道):

    #include <unistd.h>                       
    int main(void)                            
    {                                         
            int cso[2];                       
            pipe(cso);                        
            if (fork() == 0) {                
                    close(cso[0]);            
                    write(cso[1], "cso\n", 4);
                    return 0;                 
            }                                 
            close(cso[1]);                    
            sleep(2);                         
            if (fork() == 0) {                
                    char line[4];             
                    read(cso[0], line, 4);    
                    write(1, line, 4);        
                    return 0;                 
            }                                 
            close(cso[0]);                    
            return 0;                         
    }                                         
    

    【讨论】:

    • “写”和“读”过程是如何定义的?我猜测取决于当前进程中管道文件描述符的哪一端是“打开的”?
    • 没错。通常你在分叉后立即关闭管道的未使用端。
    • 明白了,所以如果我在发送者和阅读者中都打开它们,它应该可以解决问题吗? IE。如果他们中的任何一个死了,我都不会丢失数据。如果阅读器还没有被分叉,我也应该能够在管道上发送数据?
    • “不松散数据”是什么意思?!?!?!?!
    • 我已经对问题进行了编辑,我正在尝试将数据从发送方发送到接收方,两者都是独立的进程,接收方可以在发送方之后启动一点,他们共享父进程,但在父进程的不同点被分叉。
    猜你喜欢
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多