linux进程通信--管道(pipe)(含实例代码)

管道(pipe):用于亲缘关系进程间(如父子进程,兄弟进程)的通信
一个进程写管道:写入字节数小于PIPE_BUF是原子操作,写操作在管道缓冲区没有及时读走时发生阻塞。
一个进程读管道:读操作在管道缓冲区没有数据时发生阻塞。

主要函数:
int pipe(int filedes[2]); 

代码实例创建了父子进程,父进程写管道,子进程读管道。
代码验证了写阻塞:子进程读一次管道就休眠1秒,父进程一次写操作后将阻塞,直到子进程取走数据。
代码验证了读阻塞:父进程的写一次管道后休眠1秒,子进程一次读操作后将阻塞,直到父进程再次写数据。
如果管道内的实际数据比请求读的要少,读不阻塞。

但是无法验证写入字节数大于PIPE_BUF不是原子操作,我想不出一个方法来验证它。

附代码

 

#include  < unistd.h >
#include 
< sys / types.h >
#include 
< errno.h >
#include
< stdlib.h >
main()
{
    
int pipe_fd[2];
    pid_t pid;
    
int len = 4096*2;
    
char r_buf[len];
    
char w_buf[len];
    
char* p_wbuf;
    
int r_num;
    
int w_num;
    
int cmd;    
    memset(r_buf,
0,sizeof(r_buf));
    memset(w_buf,
0,sizeof(r_buf));
    p_wbuf
=w_buf;
    
if(pipe(pipe_fd)<0)
    
{
        printf(
"pipe create error ");
        
return -1;
    }

    
    
if((pid=fork())==0)
    
{
        close(pipe_fd[
1]);    
        
while(1)
        
{
            r_num
=read(pipe_fd[0],r_buf,sizeof(r_buf));            
            
if(r_num==0)
                
break;
            printf(    
"读字节数:%d ",r_num);
            
//sleep(1);//验证写阻塞    
        }
    
        
        close(pipe_fd[
0]);
        printf(    
"子进程退出... ");    
    }

    
else if(pid>0)
    
{
        close(pipe_fd[
0]);//关闭读
        
//sleep(5);
        while(1)
        
{
            
//w_num = write(pipe_fd[1],w_buf,sizeof(w_buf));
            w_num = write(pipe_fd[1],w_buf,111);
            
if(w_num!=-1)
                printf(    
"写字节数:%d ",w_num);    
            
else
                printf(    
"error ");    
            sleep(
1);//验证读阻塞    
        }

        close(pipe_fd[
1]);//关闭写
        printf(    "父进程退出... ");    
    }
    
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值