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