第一个进程不应该开始它的第(i)次迭代,除非第二个进程完成了它的第(i-1)次迭代。输出不是我需要的。我想知道是否可以通过只有两个信号量? 这是我的代码。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <semaphore.h>
sem_t semA, semB,sem,m;
int main(void)
{
int i;
pid_t child_a, child_b,pid2,pid3;
sem_init(&semA, 0, 1);
sem_init(&semB, 0, 0);
sem_init(&m, 0, 0);
child_a = fork();
//wait();
if (child_a == 0) {
// int j;
pid2 =getpid();
for (i = 0; i < 5; )
{
sem_wait(&semA);
//sem_wait(&m);
printf("child1: %d\n", i);
i++;
//printf("pid1: %d\n", pid2);
//printf("--------------------------\n");
sleep(3);
//sem_post(&m);
sem_post(&semB);
}
}
else {
child_b = fork();
//wait();
if (child_b == 0) {
pid3 =getpid();
for (i = 0; i < 5;)
{
sem_wait(&semB);
//sem_wait(&m);
printf("child2: %d\n", i);
i++;
//printf("pid2: %d\n", pid3);
//printf("--------------------------\n");
sleep(5);
//sem_post(&m);
sem_post(&semA);
}
}
}
exit(0);
return 0;
}
我期望的输出是:
child1: 0
child2: 0
child1: 1
child2: 1
child1: 2
child2: 2
child1: 3
child2: 3
child1: 4
child2: 4
child1: 5
child2: 5
child1: 6
child2: 6
child1: 7
child2: 7
child1: 8
child2: 8
child1: 9
child2: 9
但我只有一个孩子:
child1: 0
(我正在运行UBUNTU 12.10)
答案 0 :(得分:2)
为了在多个进程中使用信号量,您必须使用命名信号量或将信号量放在共享内存中。
请参阅linux手册页sem_overview(7)。
对于您正在做的事情,命名信号量比共享内存更容易使用。以下应该有效:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/stat.h>
sem_t * semA;
sem_t * semB;
int main(void)
{
int i;
pid_t child_a, child_b,pid2,pid3;
semA = sem_open("/mysema", O_CREAT, S_IRUSR | S_IWUSR, 1);
semB = sem_open("/mysemb", O_CREAT, S_IRUSR | S_IWUSR, 0);
child_a = fork();
if (child_a == 0) {
pid2 =getpid();
for (i = 0; i < 5; )
{
sem_wait(semA);
printf("child1: %d\n", i);
i++;
sem_post(semB);
sleep(3);
}
}
else {
child_b = fork();
if (child_b == 0) {
pid3 =getpid();
for (i = 0; i < 5;)
{
sem_wait(semB);
printf("child2: %d\n", i);
i++;
sleep(5);
sem_post(semA);
}
}
}
exit(0);
return 0;
}