linux应用程序开发-进程通信(IPC)

IPC

why:

1.数据传输

2.资源共享

目的:

3.通知事件

4.进程控制

 

发展:

1.UNIX进程间通信

2.基于SYStem V

3.POSIX

 

方式分类:

1.pipe(管道) FIFO(有名管道)

2.signal

3.消息队列

4.共享内存

5.信号量

6.套接字(socket)

 

管道通信:单向,先进先出

创建

pipe:父子之间通讯

FIFO:任意

创建:

int pipe(int filedis[2]);

管道创建时,产生两个文件描述符:filedis[0]读管道,filedid[1]写管道。

 

关闭:

close(filedis[1,2])

关闭两个描述符

 

管道读写:

父进程写filedis[1],子进程读filedis[0]

fork必须再pipe之前创建。

 

有名管道:FIFO

创建

#include<sys/types.h>

#include<sys/stat.h>

int mkfifo(const char*pathname,mode_t mode);

pathname:FIFO文件名

mode:属性

 

操作

当打开FIFO时,标志(O_NONBLOCK)

1.没有使用时:访问无法满足时,进程堵塞

2.使用:访问无法满足时不阻塞,立刻出错返回,error=ENXIO

 

信号通讯:

信号类型:(30种)

e:

SIGINT:CRTL+C

SIGKILL:

 

处理;

1.忽略

SIGKILL,SIGSTOP不能忽略

2.执行用户希望的动作

3.执行默认动作(大多是忽略)

signal

#include<signal.h>

void(*signal(int signo,void (*fun)(int)))(int)//如何理解??

Func可能取值:

1.SIG_LGN:忽略此信号

2.SIG_DFL:按系统默认方式

3.信号处理函数名:使用该函数处理

 

共享内存:

被多个进程共享一部分物理内存

速度快,不需要额外访问函数

 

实现:

1.创建 shmget()

2.映射到具体进程shmat()

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

key:共享内存键值

0/IPC_PRIVATE  创建新的内存,成功返回共享内存标示符,失败环回-1.

 

int shmat(int shmid,char*shmaddr,int flag)

shmid:共享内存标示符

flag:决定以什么方式来确定映射地址,通常为0

成功返回映射地址,失败返回-1.

 

脱离:

int shmdt(char*ahmaddr)

 

 

 

发送:

kill:向自身或其他进程发送

rasie:自身

#include<sys/types.h>

#include<signal.h>

int kill(pid_t,int signo)

int rasie(int signo)

pid>0:

pid==0:同组

pid<0:发送给其进程组id等于|pid|的进程

pid==-1:所有进程

 

Alarm

unsigned int alarm(unsigned int seconds);

经过预定的时间,产生sigalrm信号,如果不捕捉,则终止该进程。

 

pause

使进程调用挂起,直到收到一个信号

int pause(void)

只有执行了一个信号处理函数后后,挂起才结束。

 

信号处理

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。