Linux 程序間通訊

2021-10-01 17:41:51 字數 4180 閱讀 4024

無名管道pipe

無名管道有一定的侷限性。

第一:它是屬於半雙工的通訊方式;

第二:只有具有「親緣關係」的的程序才能使用這種通訊方式,也就是父程序和子程序之

間。int pipe(int pipefd[2])

引數pipefd[0]:用於讀管道。

引數pipefd[1]:用於寫管道。

返回值:執行成功返回0,失敗返回-1

1.建立管道 rc = pipes(pipes);

2.讀

2.寫

有名管道fifo給檔案系統提供乙個路徑,這個路徑和管道關聯,只要知道這個管道路徑,

就可以進行檔案訪問,fifo 是指先進先出,也就是先寫入的資料,先讀出來。

int mkfifo(const char pathname, mode_t mode);

引數pathname:路徑名,管道名稱。

引數mode:管道的許可權。

返回值:成功返回0,錯誤返回-1。

1.建立res = mkfifo(fifo_name,0777);

2.開啟 fifo and file1

pipe_fd = open(fifo_name , o_wronly);

data_fd = open(file1 , o_rdonly);

3. bytes_read = read(data_fd , buffer , pipe_buf);

4. buffer[bytes_read] = 『\0』;

5. 任務1:向fifo檔案寫資料 res = write(pipe_fd , buffer , bytes_read);

6. 任務:writerpipe:向fifo檔案讀資料 res = read(pipe_fd , buffer , pipe_buf);

17.5 訊息佇列msg

函式int msgsnd(int msqid, const void msgp, size_t msgsz, int msg***);

引數msqid:訊息佇列的標識碼。

引數msgp:指向訊息緩衝區的指標,此位置用來暫時儲存傳送和接收的訊息,是乙個用

戶可定義的通用結構。

引數msgsz:訊息的長短。

引數msg***:標誌位。

返回值:成功返回0,錯誤返回-1。

函式ssize_t msgrcv(int msqid, void msgp, size_t msgsz, long msgtyp,int msg***);

引數msqid:訊息佇列的標識碼。

引數msgp:指向訊息緩衝區的指標。

引數msgsz:訊息的長短

引數msg***:標誌位。

返回值:成功返回資料長度,錯誤返回-1。

結構體msgp,是乙個標準的通用結構,如下所示。

struct msgstru;

還有乙個函式msgget 需要介紹,用來獲取與某個鍵「key」關聯的訊息佇列標識。

函式int msgget(key_t key, int msg***):

引數「key」:訊息佇列關聯的鍵。

引數「msg***」:訊息佇列的建立標誌和訪問許可權。ipc_creat 如果核心中沒有此佇列,

則建立它;ipc_excl 當和ipc_creat 一起使用時,如果佇列已經存在,則失敗。

返回值:執行成功則返回訊息佇列的識別符號,否則返回-1。

msgctl(msgid,ipc_rmid,0) 刪除訊息列隊

send

1.建立訊息列隊 msgid = msgget((key_t)1234 , 0666 | ipc_creat);

2.msgsnd(msgid , (void*)&data , max_text,0)

receive

1.建立

2.msgrcv(msgid , (void*) &data , bufsiz , msgtype ,0);

3.不需要使用後刪除 msgctl(msgid , ipc_rmid , 0)

17.6 訊號signal

unsigned int alarm(unsigned int seconds);

引數seconds:鬧鐘的時間,單位為秒。

返回值:成功返回0 或者返回剩餘時間;錯誤返回-1。

sighandler_t signal(int signum, sighandler_t handler);

引數signum:等待的訊號。

引數handler:訊號到來之後,觸發的處理方式。

返回值:成功返回0,錯誤返回-1。

linux程序間通訊(一): 訊號 signal()、sigaction()

linux程序間通訊(二):訊號集函式 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()

sigint訊號代表由interruptkey產生,通常是ctrl +c 或者是delete 。執行上述**時,按下ctrl + c程式沒有反應。這就對了,如果我們想結束該程式可以按下ctrl +\來結束,當我們按下ctrl +\組合鍵時,產生了sigquit訊號,此訊號並沒有被忽略。

int sigemptyset(sigset_t *set);

該函式的作用是將訊號集初始化為空。

igaddset(增加乙個訊號至訊號集)

相關函式

sigemptyset,sigfillset,sigdelset,sigismember

表頭檔案

#include

定義函式

int sigaddset(sigset_t *set,int signum);

函式說明

sigaddset()用來將引數signum 代表的訊號加入至引數set 訊號集裡。

返回值執行成功則返回0,如果有錯誤則返回-1。

錯誤**

efault 引數set指標位址無法訪問

einval 引數signum非合法的訊號編號

17.7 訊號量semaphore

int semget(key_t key, int nsems, int sem***);

引數key:乙個用來允許不相關的程序訪問相同訊號量的整數值。

引數nsems:需要的訊號量數目。這個值通常總是1。

引數sem***:標記集合,與open 函式的標記十分類似。

返回值:成功返回識別符號,用於其它訊號函式,錯誤返回-1。

17.8 共享記憶體shmdata

共享記憶體是程序間通訊中最簡單的方式之一。共享記憶體在各種程序間通訊方式中具有最高

的效率。因為系統核心沒有對訪問共享記憶體進行同步,您必須提供自己的同步措施。解決這些

問題的常用方法是通過使用訊號量進行同步。

函式int shmget(key_t key, size_t size, int shm***);

引數key:建立新的共享記憶體物件

引數size:新建立的記憶體大小

引數shm***:識別符號

返回值:成功shmget 返回乙個共享記憶體識別符號或建立乙個共享記憶體物件,錯誤返回-1。

void *shmat(int shmid, const void *shmaddr, int shm***)

引數shmid:共享記憶體識別符號

引數shmaddr:指定共享記憶體出現在程序記憶體位址的什麼位置,直接指定為null 讓核心

自己決定乙個合適的位址位置

引數shm*** :shm_rdonly,為唯讀模式,其他為讀寫模式

返回值:成功返回共享的記憶體位址,否則返回-1。

int shmdt(const void *shmaddr)

引數shmaddr:連線的共享記憶體的起始位址。

返回值:成功返回0,錯誤返回-1。

int shmctl(int shmid, int cmd, struct shmid_ds *buf)

引數shmid:共享記憶體識別符號

引數cmd ipc_rmid:刪除這片共享記憶體

引數buf:共享記憶體管理結構體

Linux程序間通訊

程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...