利用管道實現程序間同步

2021-07-30 12:50:37 字數 2781 閱讀 1559

程序間同步是指程序的執行有先後順序,如a程序等待b程序執行完某個動作a程序才能繼續往下執行。程序間通訊的方法都可以用來同步,只是操作是否方便的乙個問題。複習了unix高階程式設計,覺得posix的訊號量是使用起來最方便的。可是無奈程式寫完放到板子裡面跑時,列印提示sem_open:function not implemented。坑了。這要改可能要重新編譯庫,這感覺並不容易,於是決定實現乙個類似訊號量介面的同步函式。

有名管道有個特性是當以唯讀方式開啟管道時會一直阻塞到有其他地方以寫開啟的時候。利用這個特性便可以實現程序同步了。

程式最上面實現的乙個通用操作,在main裡面呼叫這些介面來進行測試,如下:

lock.c

#include 

#include

#include

#include

#include

#include

#include /* for path_max */

struct l_lock

;/*

程序間同步的鎖操作封裝,利用有名管道實現

使用方法: 先用l_open_lock建立鎖,path為乙個普通路徑,flag可以為o_creat和o_excl的組合

務必判斷l_open_lock的返回值。然後用l_lock加鎖,l_unlock解鎖,最後用

l_close_lock來釋放鎖資源

風險: 當程序異常退出沒有執行l_close_lock刪掉管道,那麼管道會一直存在,使用o_excl標誌位

執行l_open_lock會總是失敗。

*/struct l_lock *l_open_lock(const

char *path, int flag)

lock->fd = -1;

strncpy(lock->path, path, path_max - 1);

ret = stat(path, &st);

/* 管道已存在的情況 */

if(ret == 0)

else

}/* 管道不存在的情況 */

if(flag & o_creat)

return lock;

}else

}int l_lock(struct l_lock *lock)

int l_unlock(struct l_lock *lock)

void l_close_lock(struct l_lock *lock)

}int main()

printf("wait...\n");

l_lock(lock);

printf("wait weakup\n");

l_close_lock(lock);

return

0;}

unlock.c

#include 

#include

#include

#include

#include

#include

#include /* for path_max */

struct l_lock

;/*

程序間同步的鎖操作封裝,利用有名管道實現

使用方法: 先用l_open_lock建立鎖,path為乙個普通路徑,flag可以為o_creat和o_excl的組合

務必判斷l_open_lock的返回值。然後用l_lock加鎖,l_unlock解鎖,最後用

l_close_lock來釋放鎖資源

風險: 當程序異常退出沒有執行l_close_lock刪掉管道,那麼管道會一直存在,使用o_excl標誌位

執行l_open_lock會總是失敗。

*/struct l_lock *l_open_lock(const

char *path, int flag)

lock->fd = -1;

strncpy(lock->path, path, path_max - 1);

ret = stat(path, &st);

/* 管道已存在的情況 */

if(ret == 0)

else

}/* 管道不存在的情況 */

if(flag & o_creat)

return lock;

}else

}int l_lock(struct l_lock *lock)

int l_unlock(struct l_lock *lock)

void l_close_lock(struct l_lock *lock)

}int main()

l_unlock(lock);

printf("please weakup\n");

l_close_lock(lock);

return

0;}

執行效果:執行lock程式後,程式會阻塞,直到執行unlock的程式將其喚醒為止。

root@ubuntu

:ac_product_svn5449

# ./lock &

[1] 13602

root@ubuntu

:ac_product_svn5449

# wait...

root@ubuntu

:ac_product_svn5449

# ./unlock

wait weakup

please weakup

[1]+ done ./lock

利用管道實現程序間通訊

管道 pipe 是程序用來通訊的共享記憶體區域。乙個程序往管道中寫入資訊,而其它的程序可以從管道中讀出資訊。如其名,管道是程序間資料交流的通道。郵路 mailslots 的功能與管道類似,也是程序間通訊 interprocess communications,ipc 的媒介,只不過其具體實現方式與管...

利用管道實現多程序間通訊

管道是linux系統最常見的程序間通訊方式之一,它在兩個程序之間實現乙個資料流通的通道,資料以一種資料流的方式在程序間流動。它把乙個程式的輸出直接連到另乙個程式的輸入。管道可以分為以下兩種,利用這兩種管道可以實現程序間的通訊,但是對於程序間的關係會有所限制 解決和 方法如下,資料以字元為例,通訊的內...

利用管道實現程序間的單向通訊

管道是程序間通訊的最原始方式,今天我們利用管道的程序間通訊,來實現簡單的程序間單向通訊 首先我們需要了解命名管道的一些特性命名管道的使用與建立 然後建立乙個fifo c的檔案來實現輸入資料和傳送資料 這是乙個命名管道的實現,往命名管道中寫入資料,並且傳送給另乙個程序 1.建立乙個命名管道 int m...