C语言 如何阻止其他进程,但在其他进程被阻止时仍然能够使用函数?



>我有一个多进程,我想用信号量阻止其他进程,以停止伪代码中间函数的访问。

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 确实具有本机互斥锁类型,但它们只是本地进程(因此只能用于单个进程中的多线程(

相关内容

  • 没有找到相关文章