C-后台进程完成时通知
我正在创建一个小型shell程序,shell的一个功能是能够在后台运行命令 如果作业在后台运行,则会显示一条小消息,通知用户pid 此外,我还希望能够在后台工作完成时通知用户 这是我目前的代码:C-后台进程完成时通知,c,process,posix,wait,C,Process,Posix,Wait,我正在创建一个小型shell程序,shell的一个功能是能够在后台运行命令 如果作业在后台运行,则会显示一条小消息,通知用户pid 此外,我还希望能够在后台工作完成时通知用户 这是我目前的代码: int execArgs(char *argv[], int bg) { int pid ; int child_info = -1; if(argv[1] == "exit"){ printf("%s\n", argv[0]); } if ( arg
int execArgs(char *argv[], int bg)
{
int pid ;
int child_info = -1;
if(argv[1] == "exit"){
printf("%s\n", argv[0]);
}
if ( argv[0] == NULL ) /* nothing succeeds */
return 0;
if ( (pid = fork()) == -1 )
perror("fork");
else if ( pid == 0 ){
signal(SIGINT, SIG_DFL);
signal(SIGQUIT, SIG_DFL);
execvp(argv[0], argv);
perror("cannot execute command");
exit(1);
}
else {
if(bg == 0){
if ( wait(&child_info) == -1 )
perror("wait");
}
else
printf("The Process PID:%d has started\n", pid);
}
return child_info;
}
我知道答案就在于这件事
pid_t return_pid = waitpid(process_id, &status, WNOHANG);
但我不明白如何完全使用它,“状态”是什么意思
我试着这样实现它:
int execArgs(char *argv[], int bg)
{
int pid ;
int child_info = -1;
if(argv[1] == "exit"){
printf("%s\n", argv[0]);
}
if ( argv[0] == NULL ) /* nothing succeeds */
return 0;
if ( (pid = fork()) == -1 )
perror("fork");
else if ( pid == 0 ){
signal(SIGINT, SIG_DFL);
signal(SIGQUIT, SIG_DFL);
execvp(argv[0], argv);
perror("cannot execute command");
exit(1);
}
else {
if(bg == 0){
if ( wait(&child_info) == -1 )
perror("wait");
}
else
printf("The Process PID:%d has started\n", pid);
int status;
pid_t return_pid = waitpid(pid, &status, WNOHANG); /* WNOHANG def'd in wait.h */
if (return_pid == -1) {
/* error */
} else if (return_pid == 0) {
/* child is still running */
} else if (return_pid == pid) {
printf("The process PID:%d has finished\n", pid);
}
}
return child_info;
}
但它不起作用。我读过手册页,但是有点麻烦,我不理解
抱歉如果答案在StackOverFlow的其他地方,我会尽可能彻底地搜索。当子进程退出时,父进程将收到一个SIGCHLD。没有阅读所有的代码,我怀疑这可能就是你在寻找的。如果你真的不做任何事情,只是等待孩子完成,你不需要信号,只需要删除WNOHANG,所以
waitpid()
阻塞直到孩子退出。argv[1]=“退出”
是错误的。使用strcmp