Process 如何为父级&;执行信号量操作;子进程?

Process 如何为父级&;执行信号量操作;子进程?,process,synchronization,fork,shared-memory,semaphore,Process,Synchronization,Fork,Shared Memory,Semaphore,如果semget调用在父进程和子进程之间共享信号量? 我有这段代码,对于同一段代码,我观察到,如果父进程先运行,子进程有时会得到更改的信号量值,但当子进程先运行时,父进程似乎永远不会执行更改的信号量。 为什么会这样?谁能给我解释一下这件事吗 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h

如果semget调用在父进程和子进程之间共享信号量? 我有这段代码,对于同一段代码,我观察到,如果父进程先运行,子进程有时会得到更改的信号量值,但当子进程先运行时,父进程似乎永远不会执行更改的信号量。 为什么会这样?谁能给我解释一下这件事吗

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
#include <math.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>

 int main() {


int semid = semget(12, 2, 0666|IPC_CREAT);
int status;



semctl(semid, 0, SETVAL, 12);
semctl(semid, 1, SETVAL, 1);

short int outarray[2], last;
char output[200];
struct sembuf obj1[] = { {0, -1, SEM_UNDO}, {1, -1, SEM_UNDO} };
struct sembuf obj2[] = { {0, 0, SEM_UNDO}, {1, 0, SEM_UNDO} };
struct sembuf obj3[] = { {0, 1, SEM_UNDO}, {1, 1, SEM_UNDO} };

int pid = fork();
//wait(&status);    

    semctl(semid, 2, GETALL, outarray);
    printf("OUT(%d):%d %d %d\n", getpid(),outarray[0], outarray[1], last);
if(pid!=0) {

    printf("Semid Parent:%d\n",semid);

    semctl(semid, 2, GETALL, outarray);
    printf("%d %d %d\n", outarray[0], outarray[1], last);
    printf("Parent Check1\n");
    last = semop(semid, obj1, 2);
    semctl(semid, 2, GETALL, outarray);
    printf("%d %d %d\n", outarray[0], outarray[1], last);
    printf("Parent Check2\n");
    last = semop(semid, obj2, 2);
    semctl(semid, 2, GETALL, outarray);
    printf("%d %d %d\n", outarray[0], outarray[1], last);
    printf("Parent Check3\n");
    //sleep(10);

}
else {

    semctl(semid, 2, GETALL, outarray);
    printf("Child: %d %d %d\n", outarray[0], outarray[1], last);
    //leep(2);
    printf("Semid Child:%d\n",semid);
    int x;
    printf("Child Check1\n");
    last = semop(semid, obj1, 2);
    semctl(semid, 2, GETALL, outarray);
    printf("child %d %d %d\n", outarray[0], outarray[1], last);
    //sleep(2);
    printf("Child Check2\n");
    last = semop(semid, obj3, 2);
    semctl(semid, 2, GETALL, outarray);
    printf("child %d %d %d\n", outarray[0], outarray[1], last);
    //sleep(2);
    printf("Child Check3\n");
    last = semop(semid, obj1, 2);
    semctl(semid, 2, GETALL, outarray);
    printf("child %d %d %d\n", outarray[0], outarray[1], last);
    //sleep(2);
    printf("Child Check4\n");
    //sleep(10);
    semctl(semid, 2, GETALL, outarray);
    printf("child %d %d %d\n", outarray[0], outarray[1], last);
    semctl(semid, 2, GETNCNT, x);
    printf("%d\n",x);

    sleep(5);
}

return 0;
}
这是第一次运行child时的输出。我在if循环中添加了等待

OUT(3679):12 1 0
OUT(3680):12 1 0
Child: 12 1 0
Semid Child:0
Child Check1
child 11 0 0
Child Check2
child 12 1 0
Child Check3
child 11 0 0
Child Check4
child 11 0 0
0

Semid Parent:0
12 1 0
Parent Check1
11 0 0
Parent Check2

我已经做了更改并删除了输出的屏幕截图。并将输出添加为文本
OUT(3679):12 1 0
OUT(3680):12 1 0
Child: 12 1 0
Semid Child:0
Child Check1
child 11 0 0
Child Check2
child 12 1 0
Child Check3
child 11 0 0
Child Check4
child 11 0 0
0

Semid Parent:0
12 1 0
Parent Check1
11 0 0
Parent Check2