進(jìn)程間通信之: 信號量
現在我們調用這些簡(jiǎn)單易用的接口,可以輕松解決控制兩個(gè)進(jìn)程之間的執行順序的同步問(wèn)題。實(shí)現代碼如下所示:
/*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 )建一個(gè)信號量*/
init_sem(sem_id,0);
/*調用fork()函數*/
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)的代碼部分并觀(guān)察運行結果。
$./simple_fork
Childprocesswillwaitforsomeseconds…/*子進(jìn)程在運行中*/
Thereturnedvalueis4185inthefatherprocess(PID=4184)/*父進(jìn)程先結束*/
[…]$Thereturnedvalueis0inthechildprocess(PID=4185)/*子進(jìn)程后結束了*/
再添加信號量的控制部分并運行結果。
$./sem_fork
Childprocesswillwaitforsomeseconds…
/*子進(jìn)程在運行中,父進(jìn)程在等待子進(jìn)程結束*/
Thereturnedvalueis0inthechildprocess(PID=4185)/*子進(jìn)程結束了*/
Thereturnedvalueis4185inthefatherprocess(PID=4184)/*父進(jìn)程結束*/
本實(shí)例說(shuō)明使用信號量怎么解決多進(jìn)程之間存在的同步問(wèn)題。我們將在后面講述的共享內存和消息隊列的實(shí)例中,看到使用信號量實(shí)現多進(jìn)程之間的互斥。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)數字通信相關(guān)文章:數字通信原理
評論