1

我尝试将牵引进程(子进程和父进程)与信号量同步,但我的尝试失败了。

C源代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/stat.h>


int compteur=0;
sem_t *sem;

int main()
{
        void *ret;
        sem = sem_open("/sem", O_CREAT, 0644, compteur);
        sem_init(sem, 0, 0);
        pid_t pid;
        pid=fork();
        switch (pid)
        {
            case -1:
                printf("Erreur: echec du fork()\n");
                exit(1);
                break;
            case 0:
                /* PROCESSUS FILS */
                printf("Processus fils : pid = %d\n", getpid() );
                sem_post(sem);
                break;
            default:
                sem_wait(sem);
                /* PROCESSUS PERE */
                printf("Ici le pere%d: le fils a un pid=%d\n",getpid(),pid);
                printf("Fin du pere.\n");
    }   
}

我认为问题在于信号量在子进程中不可见。我怎么解决这个问题?

4

2 回答 2

0

sem_init应该是:

sem_init(sem, 1, 0);  

也就是说,第二个参数应该是非零的。
因为对于:

#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);

(来自man sem_init

If  pshared  has  the  value 0, then the semaphore is shared between the threads of a process...
If pshared is nonzero, then the semaphore is shared between processes...
于 2013-04-16T11:36:29.503 回答
-1

0 是主进程,-1 是错误,任何大于 0 的值都是子进程。您必须有机会切换到 >0 才能获得孩子。

于 2013-04-16T11:30:27.257 回答