[英]Shell job control
對於我的學校項目,我正在實施一個shell,我需要有關工作控制的幫助。 如果我們輸入一個命令,比如說cat &
,那么因為&
它應該在后台運行,但它不起作用。 我有這個代碼:
{
int pid;
int status;
pid = fork();
if (pid == 0) {
fprintf(stderr, "Child Job pid = %d\n", getpid());
execvp(arg1, arg2);
}
pid=getpid();
fprintf(stderr, "Child Job pid is = %d\n", getpid());
waitpid(pid, &status, 0);
}
您應該為SIGCHLD信號設置信號處理程序,而不是直接等待。 只要子進程停止或終止,就會發送SIGCHLD。 查看流程完成的GNU描述。
本文的結尾有一個示例處理程序(我或多或少地復制並粘貼在下面)。 嘗試從中建模代碼。
void sigchld_handler (int signum) {
int pid, status, serrno;
serrno = errno;
while (1) {
pid = waitpid(WAIT_ANY, &status, WNOHANG);
if (pid < 0) {
perror("waitpid");
break;
}
if (pid == 0)
break;
/* customize here.
notice_termination is in this case some function you would provide
that would report back to your shell.
*/
notice_termination (pid, status);
}
errno = serrno;
}
關於這個主題的另一個很好的信息來源是UNIX環境中的高級編程 ,第8章和第10章。
父進程正在調用子進程上的waitpid
,這將阻塞子進程改變狀態(即終止)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.