進(jìn)程間通信之: 信號量
現(xiàn)在我們調(diào)用這些簡單易用的接口,可以輕松解決控制兩個進(jìn)程之間的執(zhí)行順序的同步問題。實(shí)現(xiàn)代碼如下所示:
/*fork.c*/
#includesys/types.h>
#includeunistd.h>
#includestdio.h>
#includestdlib.h>
#includesys/types.h>
#includesys/ipc.h>
#includesys/shm.h>
#defineDELAY_TIME3/*為了突出演示效果,等待幾秒鐘,*/
intmain(void)
{
pid_tresult;
intsem_id;
sem_id=semget(ftok(.,'a'),1,0666|IPC_CREAT);/*創(chuàng)建一個信號量*/
init_sem(sem_id,0);
/*調(diào)用fork()函數(shù)*/
result=fork();
if(result==-1)
{
perror(Forkn);
}
elseif(result==0)/*返回值為0代表子進(jìn)程*/
{
printf(Childprocesswillwaitforsomeseconds...n);
sleep(DELAY_TIME);
printf(Thereturnedvalueis%dinthechildprocess(PID=%d)n,
result,getpid());
sem_v(sem_id);
}
else/*返回值大于0代表父進(jìn)程*/
{
sem_p(sem_id);
printf(Thereturnedvalueis%dinthefatherprocess(PID=%d)n,
result,getpid());
sem_v(sem_id);
del_sem(sem_id);
}
exit(0);
}
讀者可以先從該程序中刪除掉信號量相關(guān)的代碼部分并觀察運(yùn)行結(jié)果。
$./simple_fork
Childprocesswillwaitforsomeseconds…/*子進(jìn)程在運(yùn)行中*/
Thereturnedvalueis4185inthefatherprocess(PID=4184)/*父進(jìn)程先結(jié)束*/
[…]$Thereturnedvalueis0inthechildprocess(PID=4185)/*子進(jìn)程后結(jié)束了*/
再添加信號量的控制部分并運(yùn)行結(jié)果。
$./sem_fork
Childprocesswillwaitforsomeseconds…
/*子進(jìn)程在運(yùn)行中,父進(jìn)程在等待子進(jìn)程結(jié)束*/
Thereturnedvalueis0inthechildprocess(PID=4185)/*子進(jìn)程結(jié)束了*/
Thereturnedvalueis4185inthefatherprocess(PID=4184)/*父進(jìn)程結(jié)束*/
本實(shí)例說明使用信號量怎么解決多進(jìn)程之間存在的同步問題。我們將在后面講述的共享內(nèi)存和消息隊(duì)列的實(shí)例中,看到使用信號量實(shí)現(xiàn)多進(jìn)程之間的互斥。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)數(shù)字通信相關(guān)文章:數(shù)字通信原理
評論