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

相關文章
相關標籤/搜索