如何實現Linux程序之間的通訊

2021-08-07 12:12:05 字數 2519 閱讀 8518

多程序在程式當中執行的順序.

<?php

$pid = pcntl_fork();

//父程序和子程序都會執行下面**

if ($pid == -1) else

if ($pid) else

程序的訊號註冊

function

sig_handler

($signo)

pcntl_singal(sighup, 'sig_handler');//註冊訊號

//獲取當前的程序id

pcntl_kill(posix_getpid(),sighup,);//向當前id傳送hup訊號

pcntl_signal_dispatch();//分發訊號

在進行一下方式之前確保php開啟了如下的擴充套件.

--enable-sysvsem

--enable-sysvshm

--enable-sysvmsg

這裡只是寫一下php的**,各個語言環境可能實現不同.

ftok($pathname)//從檔案路徑獲得乙個system v ipc key  比較重要 在共享記憶體,訊號量會用到

shm_attach($key, $memsize, $prem = 0666)//根據key獲取一塊共享記憶體

mixed shm_get_var ( resource $shm_identifier , int $variable_key ) //shm_identifier指明是哪一塊共享記憶體, 根據variable_key獲取value

bool shm_has_var ( resource $shm_identifier , int $variable_key )//判斷$variable_key 是否在共享記憶體當中存在

bool shm_put_var ( resource $shm_identifier , int $variable_key , mixed $variable ) //抽象一下 相當於乙個hashtable $variable_key => $variable 存入指定的共享記憶體

shm_remove(resource $shm_identifier)//徹底將共享記憶體的資源從系統當中刪除

//訊號量:

resource sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]] )//根據key生成乙個訊號量資源

bool sem_acquire ( resource $sem_identifier [, bool $nowait = false ] )//根據訊號量資源,會一直阻塞到訊號量被獲取

bool sem_release ( resource $sem_identifier )//釋放訊號量,別的程序可以獲取

bool sem_remove ( resource $sem_identifier )//徹底刪除訊號量

//佇列

resource msg_get_queue ( int $key [, int $perms = 0666 ] )//建立或者獲取乙個佇列

bool msg_queue_exists ( int $key )//判斷佇列是否存在

bool msg_receive ( resource $queue , int $desiredmsgtype , int &$msgtype , int $maxsize , mixed &$message [, bool $unserialize = true [, int $flags = 0 [, int &$errorcode ]]] )//從佇列當中獲取資料,$maxsize設定最大記憶體用來儲存接收到的資料,$flag可以設定非阻塞模式等,$deseiredmsgtype 指定需要的型別的訊息

bool msg_send ( resource $queue , int $msgtype , mixed $message [, bool $serialize = true [, bool $blocking = true [, int &$errorcode ]]] )

bool msg_remove_queue ( resource $queue )//徹底刪除記憶體佇列

訊號量也可以用來進行通訊,當乙個程序結束後會釋放訊號量,那麼別的程式就會獲取.如此一來就可以通過其中乙個程序的結束釋放訊號量來通知另乙個程序,但是資訊量比較少.缺點是:交流資訊最少,在php-fpm模式下不是乙個好的實現,另乙個程序只能知道執行完成,結合共享記憶體那麼就可以實現的更完善資訊交流機制.

訊號量相當於乙個加鎖的機制存在,放止多程序產生競態.

system v 訊息佇列

socket廣泛被用於乙個網路通訊,當然也可以被用於程序之間的通訊.

在c語言建立socket選擇af_unix就可以建立乙個unix套接字

當其中的以個程序獲取到了另乙個程序的pid,就可以傳送訊號給相應的程序,程序做出相應的處理.以這種方式實現只能是針對linux定義的訊號,資訊也是有限的,但是實現比較簡單.

linux 程序之間 的通訊

在linux程序中有時需要程序之間相互的通訊 mmap 記憶體對映就是其中一種 通過建立檔案對映到磁碟,然後返回乙個指標,這樣就可以對磁碟進行讀取 mmap 系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。普通檔案被對映到程序位址空間後,程序可以向訪問普通記憶體一樣對檔案進行訪問,不必再呼...

執行緒之間和程序之間的同步

今天學習的內容為 利用互斥事件來控制線程之間 程序之間的同步問題。其實,程序之間的同步也就類似於執行緒之間的同步。互斥事件的作用就是為了保證任乙個時間內,只有乙個執行緒對對公共資源進行操作。下面來看一下執行緒之間的同步,如果是在乙個程序內的執行緒同步問題的話。這樣的例子很多,我就舉乙個最簡單的,執行...

程序之間 執行緒之間的通訊方式

1 程序間的8中通訊方式 1 無名管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 2 高階管道 popen 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方...