首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解用于ipc通信的linux管道的生命线

理解用于ipc通信的linux管道的生命线
EN

Stack Overflow用户
提问于 2014-11-29 14:42:38
回答 1查看 338关注 0票数 2

我想了解一根管子的寿命?http://linux.die.net/man/2/pipe

  1. 如果发送方或接收方死亡/退出,管道中的数据是否仍处于活动状态?
  2. 如果接收器不存在,可以创建管道吗?(即还没有分叉)?

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

此外,发送方也可能在任何时候完成处理和退出。我试图看看使用管道的队列而不是共享内存队列是否对我有用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-29 14:52:16

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

如果写入过程退出,读取器可以对管道中的所有剩余数据进行read,但是它中的后续read系统调用将返回读取的0字节,这就是您知道已经结束的原因。如果写入过程仍然保持管道打开,但不向管道写入任何内容,则read将阻塞直到字节可用为止。

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

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

所以管道也许能存活下来,而不是读者。概念证明(cső是匈牙利管道):

代码语言:javascript
复制
#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;                         
}                                         
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27203463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档