2015-12-24 1 views
3

Эта линия в вилке (doc) человек получил мое внимание:Какой ребенок не наследует настройки семафора от своего родителя (semop (2))?

  • Ребенок не наследует семафор корректировки от своего родителя (semop (2)).

Что это значит?

Эта программа (код ниже) не печатать бы «Конец (ребенка)»:

#define SVID_SOURCE 1 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/ipc.h> 
#include <sys/sem.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 

int main(int argc, char **argv) { 

    struct sembuf operation; 
    int semid = semget (getpid(), 1, 0666 | IPC_CREAT); 
    semctl (semid, 0, SETVAL, 1); 

    if (fork() == 0) { 
     sleep(1); // Let the father do semop() 
     operation.sem_num = 0; 
     operation.sem_op = -1; 
     operation.sem_flg = 0; 
     semop (semid, &operation, 1); 
     printf("End (child).\n"); 
     exit(0); 
    } 

    operation.sem_num = 0; 
    operation.sem_op = -1; 
    operation.sem_flg = 0; 
    semop (semid, &operation, 1); 
    wait (NULL); 
    printf("The end.\n"); 

    return 0; 
} 
+0

В принципе, семафорные настройки сбрасываются в дочернем элементе. – fuz

+0

Ясное объяснение или пример будет действительно полезным – issathink

+0

Почему, по вашему мнению, код будет печатать 'End (child) .'? Какое значение, по вашему мнению, имеет семафор, когда ребенок пытается его _semop() _ и почему вы думаете, что это будет успешным? – pilcrow

ответ

3

В первую очередь, имеются две независимые подсистемы семафор: в старом стиле System V семафоры и POSIX семафоры. Не путайте с тем, что оба являются частью POSIX. К вопросам, связанным с этим вопросом, относятся семафоры System V.

Системный вызов semop(2) используется для управления значениями в наборе семафоров системы V. Процесс, который изменяет набор семафоров через эту функцию, может сделать это таким образом, который автоматически отменяется, когда процесс завершается, включив в аргументы определенный флаг (представленный SEM_UNDO). Это вызывает набор «настроек семафора» для этого набора семафоров, который должен быть связан с процессом. Именно эти корректировки не наследуются на вилке, и это имеет смысл, потому что если они были унаследованы, то отмена будет выполняться дважды - один раз, когда ребенок выйдет, и один раз, когда родитель выйдет.

Семафоры POSIX, как правило, считаются предоставляющими гораздо лучший API, и обычно они должны быть предпочтительнее семафоров системы V, но полезно знать оба.

+0

Это очень понятно, спасибо. Они должны были включить это в документы. – issathink