我的代码似乎没有在结束之前运行

时间:2019-01-06 20:08:56

标签: c linux memory exit

我创建了一个使用共享内存和子进程的应用程序。当我想关闭程序时,我使用函数'managedEnd'杀死了所有剩余的子进程并破坏了共享内存,但是似乎函数中的代码没有被执行/未完成,并且打印语句从未被打印过。

 /*
  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 :(得分:0)

这是kill(3)手册页的一部分

  

如果pid为0,则sig应发送到所有进程(不包括   进程组ID相等的未指定的系统进程集)   到发送方的进程组ID,并且该进程具有   允许发送信号。

因此,调用kill的进程是进程组的一部分,因此它与所有子进程一起被杀死,并且之后没有任何tidyup代码运行。