我正在创建一个小型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 ( 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的其他地方,请道歉,我尽可能彻底地搜索。