進(jìn)程間通信之: 信號量
3.使用實(shí)例
本實(shí)例說(shuō)明信號量的概念以及基本用法。在實(shí)例程序中,首先創(chuàng )建一個(gè)子進(jìn)程,接下來(lái)使用信號量來(lái)控制兩個(gè)進(jìn)程(父子進(jìn)程)之間的執行順序。
因為信號量相關(guān)的函數調用接口比較復雜,我們可以將它們封裝成二維單個(gè)信號量的幾個(gè)基本函數。它們分別為信號量初始化函數(或者信號量賦值函數)init_sem()、P操作函數sem_p()、V操作函數sem_v()以及刪除信號量的函數del_sem()等,具體實(shí)現如下所示:
/*sem_com.c*/
#includesem_com.h
/*信號量初始化(賦值)函數*/
intinit_sem(intsem_id,intinit_value)
{
unionsemunsem_union;
sem_union.val=init_value;/*init_value為初始值*/
if(semctl(sem_id,0,SETVAL,sem_union)==-1)
{
perror(Initializesemaphore);
return-1;
}
return0;
}
/*從系統中刪除信號量的函數*/
intdel_sem(intsem_id)
{
unionsemunsem_union;
if(semctl(sem_id,0,IPC_RMID,sem_union)==-1)
{
perror(Deletesemaphore);
return-1;
}
}
/*P操作函數*/
intsem_p(intsem_id)
{
structsembufsem_b;
sem_b.sem_num=0;/*單個(gè)信號量的編號應該為0*/
sem_b.sem_op=-1;/*表示P操作*/
sem_b.sem_flg=SEM_UNDO;/*系統自動(dòng)釋放將會(huì )在系統中殘留的信號量*/
if(semop(sem_id,sem_b,1)==-1)
{
perror(Poperation);
return-1;
}
return0;
}
/*V操作函數*/
intsem_v(intsem_id)
{
structsembufsem_b;
sem_b.sem_num=0;/*單個(gè)信號量的編號應該為0*/
sem_b.sem_op=1;/*表示V操作*/
sem_b.sem_flg=SEM_UNDO;/*系統自動(dòng)釋放將會(huì )在系統中殘留的信號量*/
if(semop(sem_id,sem_b,1)==-1)
{
perror(Voperation);
return-1;
}
return0;
}
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)數字通信相關(guān)文章:數字通信原理
評論