问题描述
pid_t pid;
pid = fork(); //Two processes are made
if (pid > 0 && runBGflag==0) //Parent process. Waits for child termination and prints exit status
{
int status;
if (waitpid(pid,&status,0) == pid && WIFEXITED(status))
{
printf("Exitstatus [");
for (int i = 0; i < noOfTokens; i++)
{
printf("%s ",commands[i]);
}
printf("\b] = %d\n",WEXITSTATUS(status));
}
}
else if (pid == 0) //Child process. Executes commands and prints error if something unexpected happened
{
if (runBGflag==1) insertElement(getpid(),ptr);
execvp(commands[0],commands);
printf ("exec: %s\n",strerror(errno));
exit(1);
}
简而言之,创建了一个子进程,如果设置了 runBackGround 标志,父进程将不会等待子进程退出,而是继续运行。如果创建了后台进程,则后台进程的PID 存储在一个列表中。稍后,这个函数被调用
void delete_zombies(void)
{
pid_t kidpid;
int status;
char buffer[1337];
while ((kidpid = waitpid(-1,WNOHANG)) > 0)
{
removeElement(kidpid,buffer,1337);
printf("Child %ld terminated\n",kidpid);
printf("its command was %s\n",buffer);
}
}
这个函数只是检查是否有任何子进程已经死亡,在这种情况下删除它们。然后它将在列表中搜索孩子的 PID,将其删除并打印出来。
问题是,delete_zombies 函数会发现一个子进程已经死亡,然后会尝试将其从列表中删除,但它只找到一个空列表,就好像子进程从未将其 PID 插入列表中一样。
这真的很奇怪,因为delete_zombies只找到一个死的子进程,当创建了一个设置了背景标志的进程,所以我们知道insertElement肯定被调用了,但奇怪的是当父进程检查列表时什么都没有
是因为子进程和父进程有单独的列表,还是PID可能有问题?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)