了解ipc通信的linux管道生命线

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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。如果他们中的任何一个死了,我都不会丢失数据。如果阅读器还没有被分叉,我也应该能够在管道上发送数据? “不松散数据”是什么意思?!?!?!?! 我已经对问题进行了编辑,我正在尝试将数据从发送方发送到接收方,两者都是独立的进程,接收方可以在发送方之后启动一点,他们共享父进程,但在父进程的不同点被分叉。

以上是关于了解ipc通信的linux管道生命线的主要内容,如果未能解决你的问题,请参考以下文章

深刻理解Linux进程间通信(IPC)

linux 进程间通信机制(IPC机制)- 管道

Linux下的进程通信方式(IPC)——管道通信

研究如何使用IPCDump在Linux上跟踪进程间通信

深刻理解Linux进程间通信(IPC)

IPC 进程间通信