linux處理序間通訊

來源:互聯網
上載者:User

進程是一個獨立的資源分派單元,不同進程之間進程是獨立的。

Linux作業系統支援的處理序間通訊機制:

(1)、同主機處理序間資料互動機制:無名管著(PIPE)、有名管道(FIFO)、訊息佇列(Message
Queue)和共用記憶體(Share Memory)。

(2)、同主機處理序間同步機制:訊號量(semaphore)

(3)、同主機處理序間非同步機制:訊號(Signal)

(4)、網路主機間資料互動機制:套介面(Socket)。

 

一、無名管道(PIPE):

普通的Linux shell都允許重新導向,而重新導向使用的就是管道。

int pipe(int fd[2]);
管道建立

注意:fd[0]用於讀取管道,fd[1]用於寫入管道。管道主要用於不同處理序間通訊。實際上,通常先建立一個管道,再通過fork函數建立一個子進程。

 

二、有名管道(FIFO)

無名管道是臨時的,在完成通訊後將自動消失,且只能在具有親緣關係的進程間實現通訊。有名管道可以在不同處理序間通訊。

int mkfifo(const char *pathname,mode_t mode);

註:在使用有名管道時,一定要使用兩個進程分別開啟其讀端與寫端

 

三、訊號(signal):

訊號是軟體中斷。訊號(signal)機制是Unix系統中最為古老的進程之間的能信機制。它用於在一個或多個進程之間傳遞非同步訊號。

1、
訊號的發送與捕捉
kill()和raise()
kill()不僅可以中止進程,也可以向進程發送其他訊號。
與kill函數不同的是,raise()函數運行向進程自身發送訊號
#include<sys/types.h>
#include<signal.h>
int kill(pid_t pid,int signo);
int raise(int signo);

2、
訊號的處理

void (*signal (int signo,void (*func)(int)))(int)

第一個參數signo為接收的訊號,第二個參數為接收到此訊號後的處理代碼入口(即處理子程式)

 

四、System V
處理序間通訊

System V提供的IPC機制主要有訊息佇列、訊號量和共用記憶體3種機制,和linux系統中檔案一樣,都有自己的讀寫屬性,但其讀寫操作不能使用普通檔案的read/write方式。任何一個IPC通訊對象都用唯一的ID來標識自己,以使其他進程能夠通過此ID值訪問它,從而實現資訊的互動。

1、
訊息佇列

主要用來實現兩個進程間少量的資料轉送,並且接收方可以根據訊息佇列中訊息的類型選擇性地接收訊息。

key_t ftok (char*pathname, char proj); 
它返回與路徑pathname相對應的一個索引值

int msgget(key_t key, int msgflg) 
將建立一個新的訊息佇列

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

該系統調用從msgid代表的訊息佇列中讀取一個訊息,並把訊息儲存在msgp指向的msgbuf結構中。

int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);
向msgid代表的訊息佇列發送一個訊息,即將發送的訊息儲存在msgp指向的msgbuf結構中,訊息的大小由msgze指定。

int msgctl(int msqid, int cmd, struct msqid_ds *buf);
該系統調用對由msqid標識的訊息佇列執行cmd操作,共有三種cmd操作:IPC_STAT、IPC_SET
、IPC_RMID。

 

2、
訊號量通訊機制

訊號量通訊機制主要用來實現進程間同步,訊號量值用來標識系統可用資源的個數。

int semget(key_t key, int num_sems, int sem_flags);

建立一個新的訊號量或是獲得一個已存在的訊號量索引值。

 

int semctl(int sem_id, int sem_num, int command, ...);

允許訊號量資訊的直接控制:

 

int semop(int sem_id, struct sembuf *sem_ops, size_t num_sem_ops);

改變訊號量的值

第一個參數,sem_id,是由semget函數所返回的訊號量標識符。第二個參數,sem_ops,是一個指向結構數組的指標,其中的每一個結構至少包含下列成員:
struct sembuf {
    short sem_num;
    short sem_op;
    short sem_flg;
}

 

3、
共用記憶體

主要用於實現進程間大量的資料轉送。在使用共用記憶體進行資料存取時,一般配合二元訊號量使用。

 int
shmget(key_t key, size_t size, int oflag );  共用記憶體區的建立和操作:

 

int shmctl( int shmid , int cmd , struct shmid_ds *buf );
共用記憶體控制函數

 

char *shmat( int shmid , void *shmaddr , int shmflag );
共用記憶體區對象映射到調用進程的地址空間

 

int shmdt( char *shmaddr );
脫離共用記憶體塊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.