Linux进程间通信

管道

管道的特性:
1、管道是 半双工的工作模式
2、所有的管道都是特殊的文件不支持定位操作。
lseek->> fd fseek ->>FILE*
3、管道是特殊文件,读写使用文件IO。
open,read,write,close;;
使用框架:
创建管道 ---- > 读写管道 —>关闭管道

有名管道

有名管道:同一主机下,任意两个进程间通信
1.创建管道文件 mkfifo

int mkfifo(const char *pathname, mode_t mode);
功能:在指定的pathname路径+名称下创建一个权限为
      mode的有名管道文件。
参数:pathname要创建的有名管道路径+名称
      mode  8进制文件权限。
返回值: 成功 0
	    失败  -1;

2.打开管道文件 open

以O_RDONLR打开时 ,管道在open处阻塞
以O_WRONLY打开时 ,管道在open处阻塞
当两端同时打开时,才解除阻塞

3.读写管道 read write

读: read(fd-read,buff,sizeof(buff));
写: write(fd-write,buff,sizeof(buff));

4.关闭管道 close

close(fd)

5.卸载管道 remove

remove();
	int remove(const char *pathname);
功能:将指定的pathname管道文件卸载,同时
		  从文件系统中删除。
参数: ptahtname 要卸载的有名管道 
返回值:成功 0
		失败  -1;

无名管道

无名管道:
特性:
1.同一主机下,具有亲缘关系的进程间通信
2.有固定的读写端

1.创建并打开无名管道(创建时会自动打开)pipe函数
2.读写管道
3.关闭管道

管道默认大小64K
1.当读端和写端都存在时,如果管道中有数据,则读出,如果没有数据则等待
2.当写端都关闭时,读端不再阻塞,如果有数据,则读出数据,如果无数据,read直接返回0
3.读端都关闭,向管道中写入数据,发生管道破裂
4.当读端和写端都存在时,当管道满时,发生写阻塞

1.创建一个整型数组来存储管道的文件描述符

int pipefd[2];

2.创建管道 pipe;

int pipe(pipefd[2]);
功能:创建并打开一个无名管道
参数:
         pipefd[0]:用于读数据的文件描述符
         pipefd[1]:用于写数据的文件描述符
返回值:
      成功:  0
      失败: -1	      

无名管道的架设应该在fork之前进行

1.写阻塞:
管道中至少有一个读端:
	写:
		管道中缓存区没有存满则直接写入
		管道中缓存区写满则阻塞等待直到有数据读出才能继续写入

2.读阻塞:		
管道中至少有一个写端:
	读:
		有数据时直接读出
		没有数据时阻塞等待直到有数据写入才能读出
		
3.管道破裂:	
管道中没有读端,写入数据:
	写:
		会产生管道破裂信号SIGPIPE,进程异常结束

4.读到0返回:		
管道中没有写端:
	读:
		有数据时直接读出 
		没有数据时不会阻塞等待直接返回,读到0

信号

信号(软中断):
进程间通知机制
异步通信
处理方式

1.忽略(不处理)
2.缺省(按照操作系统默认方式处理)
3.捕获(自定义方式处理)

1.信号的注册signal
1.能早注册尽可能早注册
2.如果信号不被注册,则会按照缺省类型
typedef void(*sighandler_t)(int);

sighandler_t signal(int signum,sighandler_t handler)
参数:
     signum:注册的信号编号
     handler:
             SIG_IGN :忽略
             SIG_DFL:缺省
             函数入口:捕获:注册的信号处理的函数接口

1.信号的注册

1.signal

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
功能:
	注册一个信号并设置信号的处理方式
参数:
	signum:信号的编号
	handler:信号的处理方式  捕获
		SIG_IGN  忽略
		SIG_DFL  缺省
		信号对应的处理函数地址
返回值:
	  成功:返回上一次注册的信号处理函数
	  失败:返回SIG_ERR

2.信号的发送

1.kill
int kill(pid_t pid, int sig);
功能:
	给进程发送信号
参数:
	pid:进程的ID号
	sig:信号的ID号
返回值:
	成功返回0
	失败返回-1
2.raise
int raise(int sig);
功能:
	给调用该函数的进程发送sig信号
3.alarm
unsigned int alarm(unsigned int seconds);
功能:
	 间隔seconds秒后给调用进程发送一个SIGALRM信号
参数:
	 seconds:秒数
返回时:
	   成功返回上次设定剩余的时间
	   上次未设定则返回0
4.pause
int pause(void);
功能:
	让调用该函数的进程挂起
    当进程收到信号时(必须被捕获),pause被唤醒

共享内存

1.创建共享内存 shmget

int shmget(key_t key, size_t size, int shmflg);

2.建立共享内存和用户空间映射 shmgat
3.读写数据
4.解除映射关系 shmdt
5.删除共享内存 shmctl
ipcs -a 查询共享内存,信号量集,消息队列
ipcrm -s 删除信号量集
-m 删除共享内存
ipcrm -m shmid
ipcrm -M shmkey

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值