我正在尝试终止我的程序,该程序从文件中获取一个充满命令的行,然后使用execvp
处理每个命令
但是,每当遇到quit
时,我都希望立即退出处理命令并忽略其后的所有其他命令。
我尝试使用exit()
for(int i =0;i < numOfCommands;i++)
{
childPid = fork();
if(childPid == 0)
{
if(execvp(commands[i].cmd[0],commands[i].cmd) == -1)
{
/*if(strcmp(commands[i].cmd[0],"quit"))
{
done = true;
return;
}*/
if(strcmp(commands[i].cmd[0],"quit")==0)
{
printf("Quit command found ! \n Quitting .");
done = true;
//return;
exit(0);
}
printf("Command %s is unknown \n", commands[i].cmd[0]);
}
}
else
{
//parent process
wait(&child_status);
}
}
}
当然在分叉之后,这发生在子进程内部。但问题是我的程序在退出程序之前一直处理退出后剩下的命令!
答案 0 :(得分:1)
您可以使用kill(2)
向进程组发送信号。您可以在父母或任何子女中执行此操作。
int kill(pid_t pid, int sig);
如果pid等于0,则sig被发送到调用进程的进程组中的每个进程。
例如:
kill(0, SIGTERM);
答案 1 :(得分:1)
我认为更好的方法是在父分支之前检查父进程中的quit
命令。
但如果您想在孩子身上做这件事,您可以向家长发送信号。
kill(getppid(), SIGUSR1);
父进程需要为SIGUSR1
建立一个信号处理程序,清除所有内容并退出。或者您可以发送SIGINT
之类的信号,其默认操作是终止进程,但最好实现干净的退出。
此外,在您的代码中,您应该在调用quit
之前检查execvp
命令。否则,如果用户的路径中有quit
个程序,它将永远不会与您的内置quit
匹配,因为execvp
将成功而不会返回。< / p>