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

IPC数组

why:socket

1.数据传输函数

2.资源共享队列

目的:进程

3.通知事件事件

4.进程控制ip

 

发展:内存

1.UNIX进程间通讯资源

2.基于SYStem Vget

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所指向的数组元素个数。

相关文章
相关标签/搜索