>我有一个多进程,我想用信号量阻止其他进程,以停止伪代码中间函数的访问。
while(true){
fork()
reset buf
getting input
while(getting input){
if(true) {give only acces to this process for the next function}
function()
if(true){stop acces to only that one process for the function}
reset buf
getting input
}
}
所以我想用语句激活并关闭信号量,只给激活语句的一个进程的访问,其他进程必须等待。
如何在 C 中实现这一点?
我希望我的问题足够清楚,可以理解
编辑 1:
现在我尝试使用sysV
unsigned short marker2[2];
struct sembuf sem_down;
sem_down.sem_num = 0;
sem_down.sem_op = -1;
sem_down.sem_flg = 0;
struct sembuf sem_up;
sem_up.sem_num = 0;
sem_up.sem_op = +1;
sem_up.sem_flg = 0;
sem_id = semget (IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | 0600);
marker2[0] = 1;
semctl(sem_id, 1, SETALL, marker2);
while(true) {
fork();
while(input){
if (strncmp("BEG", inputBuffer[0], 3) == 0) {
semop (sem_id, &sem_down, 1);
printf("blocked from %dn", getpid());
}
conditions(inputBuffer[0],
inputBuffer[1],
inputBuffer[2],
cfd, semID1, shmID);
if (strncmp("END", inputBuffer[0], 3) == 0) {
semop (sem_id, &sem_up, 1);
printf("open by %dn", getpid());
}
}
}
现在,其他进程不会被阻止
编辑 2:
sem_t semvar;
sem_init(&semvar, 0,1);
while(true) {
fork();
while(input){
if (strncmp("BEG", inputBuffer[0], 3) == 0) {
sem_wait(&semvar);
printf("blocked from %dn", getpid());
}
conditions(inputBuffer[0],
inputBuffer[1],
inputBuffer[2],
cfd, semID1, shmID);
if (strncmp("END", inputBuffer[0], 3) == 0) {
sem_post(&semvar);
printf("open by %dn", getpid());
}
}
仍然不起作用
信号量上的基本操作是"获取"——等到值不为零并以原子方式递减它,以及"释放"——递增值(从而允许等待 am "acrquire" 的人继续。
因此,要只允许一个进程访问关键部分,就像您使用信号量描述的那样,您可以将信号量值初始化为 1,在关键部分之前获取信号量,然后在之后释放它。 所以你的第一个"if(true("应该是"获取",第二个应该是"释放">
那么在 C 语言中你实际上是怎么做到的呢? 好吧,C 没有任何本机信号量类型或操作。 有许多不同的库提供它们 - SysV semctl/semop调用,POSIX sem_open,WIN32信号量,可能还有其他。 C11 确实具有本机互斥锁类型,但它们只是本地进程(因此只能用于单个进程中的多线程(