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

时间:2014-11-29 14:42:39

标签: linux pipe ipc

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

  1. 如果发送方或接收方死亡/退出,管道中的数据是否保持活动状态?
  2. 如果没有接收器,是否可以创建管道? (即尚未分叉)?
  3. 我需要将数据从发件人发送到接收者。但是,接收器可能尚未分叉,并且可能是活动的(发送者后1~2秒)。它们共享父进程,但接收方可能在发送方之后的某个时刻分叉,反之亦然。

    发件人也可以随时完成处理和退出。 我试图查看使用管道而不是共享内存队列是否适用于我。

1 个答案:

答案 0 :(得分:1)

管道必须在前叉之前创建。在fork之后,每个进程使用read或write端。最好在叉子后立即关闭管道的未使用端。

如果写入过程退出,读者可以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;                         
}