【UNIX】进程间通信

Linux继承了AT&T和BSD以及早期的进程间的通信

一般常用的通信方式有:

1)传统的通信方式:无名管道,有名管道和信号。

2)对于SYS 5 的进程间通信采用了共享内存,消息队列和信号灯的形式。

3)BSD,对于一般网络间的通信采用来套接字的方式实现。


1)无名管道的机制以及创建


对于无名管道只是用于父子进程之间的通信,采用的是半双工的方式读写操作的,这里内核系统以及默认在无名管道了fd[0]是管道的读端fd[1]是管道的写端

对于管道可以看成是一种特殊的文件,管道是基于特殊的文件描述符的通信方式,对于他的读写尅使用read和write函数来实现。


1)对于管道的创建以及读写函数,如下:

#include
   
   
    
    
#include
    
    
     
     
#include
     
     
      
      
#include
      
      
       
       

#define N 20

int pid1,pid2;

int main ()
{
	int fd[2];                  //这里的管道两端系统默认读写的
	char ch1[N] = "hello kitty";
	char ch2[N] = "hello world";
	char output[40];
	
	pipe(fd);

	while((pid1 = fork()) == -1);

	if(pid1 == 0){
		
		write(fd[1],ch1,N);
		sleep(5);
//	 	close(fd[0]);

		return 0;
	}else{
		while((pid2 = fork()) == -1);

		if (pid2 == 0){
			
			write(fd[1],ch2,N);
			sleep(5);
//			close(fd[0]);
			
		}else{
		
			read(fd[0],output,40);
			printf("this is pid1 = %s\n",output);

			read(fd[0],output,40);
			printf("this is pid2 = %s\n",output);

			return 0;
		
		}
	}

	return 0;
	
}

      
      
     
     
    
    
   
   


2)管道的读写应该注意的:

①当管道中午数据写入时,读端会一直处于阻塞状态,

②向管道写出具的时候,Linux不会保持院子特性,若果管道中有闲着空间时,写进程会试图向管道写入数据,如果读进程不读走管道缓冲区的数据,那么写操作会一直阻塞

⑶只有读端存在时,写数据才有意义




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值