- 需求
1-父进程fork出子进程C1,C2,C3,和D1,需要子进程C1,C2,C3同时运行或者子进程D1单独运行。
2-子进程C1,C2,C3调用相同的函数,只是传入的参数不同。子进程D1调用与之不同的函数。
3-使用信号量(PV操作)来解决此问题。
- 解决方法
初始化信号量的值为3,在执行子进程D1时,进行PV操作,将信号量的值先-3,子进程D1执行完成后将信号量的值+3,而在执行子进程C1,C2,C3时,由于调用相同的函数,可以在进行PV操作时,将信号量的值先-1,执行完成后将信号量的值+1,就可以解决。测试用例和测试结果如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
int sem_id;
key_t sem_key;
/* 建立信号量 */
int initsem(int *semid, key_t semkey)
{
int res = 0;
if ((*semid = semget(semkey, 3, IPC_CREAT | 0666)) == -1)
{
return -1;
}
else
res = semctl(*semid, 0, SETVAL, 3);
if (*semid == -1 || res == -1)</