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

时间:2023-03-09 03:02:01
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)

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

消息队列:链表,有特定格式

克服消息信息量少,管道无格式

分类:

posix

系统V:

持续性

内核重启,人工删除

键值:

key_t ftok(char*pathname,char proj)

返回文件对应键值

打开/创建

int msgget(key_t,int msgflg)

返回消息队列描述字

msgflg:标志位

IPC_CREAT:创建

IPC_EXCL:若存在,返回错误

IPC_NOWAIT:无法满足要求,不阻塞

创建:

1.没有于key对应的消息队列,且msgflg包含IPC_CREAT标志位

2.key参数为IPC_PRIVAT

发送消息

int msgsnd(int mysqid,struct msbuf*msgp,int msgsz,int msgflg)

struct msgbuf

{

  long mtype; //消息类型

  char mtext[1];//消息数据首地址

}

接收消息

int msgrcv(int msqid,struct msgbuf*msgp,int msgsz,long msgtyp,int msgflg)

信号量(信号灯)

保护临街资源,进程互斥,进程同步

分类

二值信号灯:只能去0,1

计数信号灯:可以大于1

创建/打开

int semget(key_t key,int nsems,int semflg)

操作:

int semop(int semid,struct sembuf *sops,unsigned nsops)

对信号量进行控制。

semid:信号集ID;

sops:是一个操作数组

nsops:sops所指向的数组元素个数。