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所指向的數組元素個數。