gpt4 book ai didi

C - 带有信号量的多个 fork

转载 作者:行者123 更新时间:2023-12-04 05:30:25 25 4
gpt4 key购买 nike

我试图最终解决生产者-消费者问题,但我首先需要能够使用信号量创建临界区。我目前遇到的问题是当我运行程序时,临界区有时会有多个进程进入它。我希望在给定时间只有一个进程处于临界区。这是我目前拥有的代码:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

#define MAX 20

int main(void)
{
key_t key = 1114;
int semid, count,
mutex = 0;


//Initialize Semaphore Buffers
struct sembuf oper0;

pid_t waitId;
pid_t parentId = getpid();

//Create processes
for(count = 0; count < MAX; count++)
{
if((waitId = fork()) == 0)
{
break;
}
}

//Create a semaphore set of 3; I will be adding more semaphores
if ((semid = semget(key, 3, 0600 | IPC_CREAT)) == -1) {
printf("error in semget");
exit(1);
}

// BINARY/MUTEX - initialize semaphore0 to 1
if(semctl(semid, mutex, SETVAL, 1) == -1)
{
printf("error in semctl");
exit(0);
}

//Decrement semaphore 0
oper0.sem_op = -1;
oper0.sem_flg = 0;
if (semop(semid, &oper0, 1) == -1) {
printf("error decrementing semaphore \n");
exit(1);
}

printf(" -- CRITICAL SECTION START ----------- \n\n");
printf("%5d %d %s\n", getpid(), semctl(semid, 0, GETVAL, oper0.sem_num), " -- Semaphore 0");
printf(" -- CRITICAL SECTION END -- \n\n");

//Increments semaphore 0
oper0.sem_op = 1;
oper0.sem_flg = 0;
if (semop(semid, &oper0, 1) == -1) {
printf("error incrementing semaphore \n");
exit(1);
}

int i;
if(getpid() == parentId)
{
for(i = 0; i < MAX i++)
{
wait(&waitId);
}
}
else
{
exit(waitId);
}

// Remove semaphore
if (semctl(semid, 0, IPC_RMID) == -1) {
printf("error in semctl");
exit(1);
}

return 0;
}

这是一个示例输出:
 -- CRITICAL SECTION START ----------- 

1097 0 -- Semaphore 0
-- CRITICAL SECTION END --

-- CRITICAL SECTION START -----------

1085 0 -- Semaphore 0
-- CRITICAL SECTION END --

-- CRITICAL SECTION START -----------

-- CRITICAL SECTION START -----------

1095 0 -- Semaphore 0
-- CRITICAL SECTION END --

1093 0 -- Semaphore 0
-- CRITICAL SECTION END --

-- CRITICAL SECTION START -----------

-- CRITICAL SECTION START -----------

1087 0 -- Semaphore 0
-- CRITICAL SECTION END --

1089 0 -- Semaphore 0
-- CRITICAL SECTION END --

-- CRITICAL SECTION START -----------

1091 0 -- Semaphore 0
-- CRITICAL SECTION END --

为什么信号量有时锁定一个进程,有时它允许两个进程进入?

最佳答案

因为你执行 semctl(semid, mutex, SETVAL, 1)在每个 child 身上。你真的只想这样做一次。如果您将 fork 循环移到创建和初始化信号量的位置之后,您可能会发现它看起来好多了。

此外,您可能想在 printf 之后 fflush(stdout);如果 stdout 被缓冲,那么即使缓冲区被写入临界区,输出也可能最终会混合在一起。

关于C - 带有信号量的多个 fork ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12701322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com