我创建了一个使用共享内存和子进程的应用程序。当我想关闭程序时,我使用函数'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);
}
关于为什么我的共享内存段未正确销毁的任何想法?
答案 0 :(得分:0)
这是kill(3)手册页的一部分
如果pid为0,则sig应发送到所有进程(不包括 进程组ID相等的未指定的系统进程集) 到发送方的进程组ID,并且该进程具有 允许发送信号。
因此,调用kill的进程是进程组的一部分,因此它与所有子进程一起被杀死,并且之后没有任何tidyup代码运行。