Мой код не запускается до его завершения - PullRequest
0 голосов
/ 06 января 2019

Я создал приложение, которое использует общую память и дочерние процессы. Когда я хочу, чтобы программа закрылась, я использую свою функцию «ControlEnd», чтобы убить все оставшиеся дочерние процессы и уничтожить разделяемую память, но кажется, что код в функции не запускается / не завершается, и операторы print никогда не печатаются ,

 /*
  controlledEnd

  This function safely exits the program ensuring there are no
  memory leaks and that the memory segment is freed.   

  The function takes 1 parameter
    -pid_t segmentID
        The segmentID of the shared memory
*/
void controlledEnd(pid_t segmentID){

    /*Kills all child processes*/
    if((int)kill(0, SIGKILL)==0){
        printf("All jobs successfully killed");
    }

    /*Logs an error if processes were not successfully killed*/
    else{
        logError("Any", "Could not kill processes on exit");
        perror("Could not deallocate memory on exit");
    }

    /*Frees the segment of shared memory used for the queue*/
    if((int)shmctl(segmentID, IPC_RMID, 0)==0){
        printf("Memory successfully deallocated");
    }

    /*Logs an error if the memory was not deallocated successfully*/
    else{
        logError("Either", "Could not deallocate memory on exit");
        perror("Could not deallocate memory on exit");
    }
    fflush(stdout);
    exit(0);
}

Есть идеи, почему мой сегмент общей памяти не уничтожается должным образом?

1 Ответ

0 голосов
/ 06 января 2019

Вот часть справочной страницы для kill (3)

Если pid равен 0, sig отправляется всем процессам (кроме неопределенный набор системных процессов), чей идентификатор группы процессов равен к идентификатору группы процессов отправителя, и для которого процесс имеет разрешение на отправку сигнала.

Таким образом, процесс, вызывающий kill, является частью группы процессов, поэтому он уничтожается вместе со всеми дочерними элементами, и после этого ни один из ваших кодов tidyup не запускается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...