Linux 程序間通訊

2021-07-11 18:36:18 字數 2235 閱讀 2110

linux下程序間通訊的幾種主要手段簡介:

1 管道(pipe)及有名管道(named pipe):管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊;

2 訊號(signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;linux除了支援unix早期訊號語義函式sigal外,還支援語義符合posix.1標準的訊號函式sigaction(實際上,該函式是基於bsd的,bsd為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式);

3 報文(message)佇列(訊息佇列):訊息佇列是訊息的鏈結表,包括posix訊息佇列system v訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

4 共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用ipc形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。

5 訊號量(semaphore):主要作為程序間以及同一程序不同執行緒之間的同步手段。

6 套介面(socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由unix系統的bsd分支開發出來的,但現在一般可以移植到其它類unix系統上:linux和system v的變種都支援套接字。

子程序寫,父程序讀。

pipe(fd[2])

fd[1]寫,fd[0]讀

#include 

#include

#include

#define maxsize 100

int main()

else

if ((pid =fork()) < 0)

else

if (pid == 0)

else

return

0;}

mkfifo(「路徑名」,檔案許可權)

#include 

#include

#include

#include

#include

#include

#define fifo "/home/fifo"

int main()

else

printf("create success!");

fd = open(fifo,o_rdwr);

if(fd == -1)

if(write(fd,"hello world",12) == -1)

else

printf("write success!\n");

if(read(fd,r_msg,bufsiz) == -1)

else

printf("receive data id %s !\n",r_msg);

close(fd);

return

0;}

shmget() 函式建立共享記憶體

shmat() 函式將共享記憶體新增到程序位址中

shmdt() 程序退出共享記憶體

shmctl() 對記憶體區域的操作

#include 

#include

#include

#include

#include

#include

#include

#include

int main()

addr = (char *)shmat(shmid,null,0);

if (addr == (char *)(-1))

printf("share memory address %s\n",addr);

strcpy(addr,"welcome to mfcheer");

pid = fork();

if (pid == -1)

else

if (pid == 0)

else

if (shmctl(shmid,ipc_rmid,null) == -1)

}return

0;}

semget() 建立訊號量

semop() 訊號量操作

semctl() 訊號量的控制

Linux程序間通訊

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

Linux程序間通訊

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

Linux程序間通訊

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