进程间通信之: 信号量
现在我们调用这些简单易用的接口,可以轻松解决控制两个进程之间的执行顺序的同步问题。实现代码如下所示:
/*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);/*创建一个信号量*/
init_sem(sem_id,0);
/*调用fork()函数*/
result=fork();
if(result==-1)
{
perror(Forkn);
}
elseif(result==0)/*返回值为0代表子进程*/
{
printf(Childprocesswillwaitforsomeseconds...n);
sleep(DELAY_TIME);
printf(Thereturnedvalueis%dinthechildprocess(PID=%d)n,
result,getpid());
sem_v(sem_id);
}
else/*返回值大于0代表父进程*/
{
sem_p(sem_id);
printf(Thereturnedvalueis%dinthefatherprocess(PID=%d)n,
result,getpid());
sem_v(sem_id);
del_sem(sem_id);
}
exit(0);
}
读者可以先从该程序中删除掉信号量相关的代码部分并观察运行结果。
$./simple_fork
Childprocesswillwaitforsomeseconds…/*子进程在运行中*/
Thereturnedvalueis4185inthefatherprocess(PID=4184)/*父进程先结束*/
[…]$Thereturnedvalueis0inthechildprocess(PID=4185)/*子进程后结束了*/
再添加信号量的控制部分并运行结果。
$./sem_fork
Childprocesswillwaitforsomeseconds…
/*子进程在运行中,父进程在等待子进程结束*/
Thereturnedvalueis0inthechildprocess(PID=4185)/*子进程结束了*/
Thereturnedvalueis4185inthefatherprocess(PID=4184)/*父进程结束*/
本实例说明使用信号量怎么解决多进程之间存在的同步问题。我们将在后面讲述的共享内存和消息队列的实例中,看到使用信号量实现多进程之间的互斥。
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码