int I, A;
int *APtr;
//create shared memory (action counter)
if((A=shmget(ftok(argv[0],getpid()), sizeof(int), IPC_CREAT | 0660)) == -1)
{
exit(2);
}
if((APtr=shmat(A,NULL,0)) == NULL)
{
exit(2);
}
*APtr = 1;
/*semaphor semA*/
sem_t semA;
if(sem_init(&semA, 0, 1)==-1)
{
exit(2);
}
/*semafor semA*/
pid_t pid;
for(int i=0; i<11; ++i)
{
if((pid = fork()) < 0)
{ //chyba spusteni noveho procesu
kill(0, SIGTERM);
exit(2);
}
else if(pid == 0)
{
I=i;
if(I == 0)//A
{
sem_wait(&semA);
//int pom = *APtr;
fprintf(stdout, "%d: A %d:\n", *APtr, I);
fflush(stdout);
*APtr+=1;
sem_post(&semA);
}
else//B
{
sem_wait(&semA);
//int pom = *APtr;
fprintf(stdout, "%d: B %d:\n", *APtr, I);
fflush(stdout);
*APtr+=1;
sem_post(&semA);
}
break;
}
else
{
//fprintf(stdout, "%d\n", *APtr);
}
}
sem_destroy(&semA);
if(pid != 0)
{
sleep(1);
fprintf(stdout, "%d\n", *APtr);
}
return 0;
int I, A;
int *APtr;
//create shared memory (action counter)
if((A=shmget(ftok(argv[0],getpid()), sizeof(int), IPC_CREAT | 0660)) == -1)
{
exit(2);
}
if((APtr=shmat(A,NULL,0)) == NULL)
{
exit(2);
}
*APtr = 1;
/*semaphor semA*/
sem_t *semA;
if(semA = sem_open("/semA", O_CREAT, 0700, 1) == SEM_FAILED)
{
exit(2);
}
/*semafor semA*/
pid_t pid;
for(int i=0; i<11; ++i)
{
if((pid = fork()) < 0)
{ //chyba spusteni noveho procesu
kill(0, SIGTERM);
exit(2);
}
else if(pid == 0)
{
I=i;
if(I == 0)//A
{
sem_wait(semA);
fprintf(stdout, "%d: A %d:\n", *APtr, I);
fflush(stdout);
*APtr+=1;
sem_post(semA);
}
else//B
{
sem_wait(semA);
fprintf(stdout, "%d: B %d:\n", *APtr, I);
fflush(stdout);
*APtr+=1;
sem_post(semA);
}
break;
}
else
{
//fprintf(stdout, "%d\n", *APtr);
}
}
if(pid != 0)
{
sleep(1);
sem_close(semA);
fprintf(stdout, "%d\n", *APtr);
}
return 0;
sem_t semA;
if(sem_init(&semA, 0, 1)==-1)
这里的信号量不在共享内存中,它存在于堆栈中。
因此,在fork()之后,每个进程都将拥有这个信号量的自己的副本。您应该将信号量放在您创建的共享内存中的某个地方,以便所有进程都可以访问相同的信号量。
您可以使用sem_open()代替sem_init(),创建一个命名的信号量,在打开它的人之间共享这些信号量。
我想创建一个共享内存和信号量的C程序。应该有两个子进程。两个孩子都有一个不同的int数。然后有一个目标号码,应该写在共享内存中。现在两个孩子都应该从进球数中减去他们的数字,直到进球数低于或等于0。我不希望出现比赛条件。这就是为什么我尝试使用信号量。但对我没用。下面是我的代码:
代码是:
程序应该创建200000个整数,并将2000个写入共享内存。分叉进程应该从共享内存中读取2000,父进程应该将下一个2000写入共享内存。 请帮帮我们谢谢你们 编辑:非常感谢您的回答。我不能标出正确的答案,因为我不知道什么是正确的。但我不想再尝试了。15个小时就够了
我尝试编写一个共享内存和信号量程序,该程序一直运行到按下Ctrl+C,即接收到: 当按下Ctrl+C时,被设置为,它会跳出循环并退出。在没有共享内存和信号量的情况下,这可以很好地工作,但是在这里,我从来没有在上获得字符串,只捕获并且它继续运行。 为什么?
我需要编写一个程序,它正在创建N个数量的子进程,每一个进程都将一个添加到共享内存变量中。我的想法是使用信号量和共享内存,但进程之间并没有相互等待,共享内存变量也没有像我希望的那样工作。 MyDefs.H Main.C 奴隶Proc.c
null 有3个信号量:互斥-初始化为1满-初始化为0空-初始化为n(而n是管道中的“字节”数) 消费者代码: 生产者代码: 如有任何帮助,不胜感激,谢谢!