shell下,進程的前臺與後臺運行

hell下,進程的前臺與後臺運行
跟系統任務相關的幾個命令:fg、bg、jobs、&、ctrl+z
1. & 最經常被用到
   這個用在一個命令的最後,可以把這個命令放到後臺執行
2. ctrl + z
     可以將一個正在前臺執行的命令放到後臺,並且暫停
3. jobs
     查看當前有多少在後臺運行的命令
4. fg
     將後臺中的命令調至前臺繼續運行 
如果後臺中有多個命令,可以用 fg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的後臺正在執行的命令的序號(不是pid)
5. bg 將一個在後臺暫停的命令,變成繼續執行
如果後臺中有多個命令,可以用bg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的後臺正在執行的命令的序號(不是pid)
1. jobs列舉出後臺作業信息。([作業號]   運行狀態   作業名稱)
2. ctrl+z 將任務放到後臺去,並暫停;
3. bg  <%int> 將後臺任務喚醒,在後臺運行;
4. fg   <%int> 將後任務的程序放到前臺;

1.  ctrl+z 將任務放到後臺去,並暫停.
     主進程waitpid(pid,&status,WUNTRACED)時,子進程
     退出時,父進程被喚醒
2.  將後臺任務喚醒,在後臺運行;
     kill(pid,SIGCONT);  
3.  將後臺運行的程序放到前臺;
     kill(pid,SIGCONT);  
     waitpid(pid,&status,WUNTRACED);
 
void fg(char *p)
{
    int pid=0;
    if(p!=NULL)
    {
        pid=atol(p);
        kill(pid,SIGSTOP);
        kill(pid,SIGCONT);
        waitpid(pid,NULL,NULL);
        pid_jobs[jobs_num--]=0;
    }
    else
    printf("error \n");
    return 0;
}   
void bg(char *p)  
{
    int pid=0;
    if(p!=NULL)
    {
    pid=atol(p); 
    kill(pid,SIGCONT);
    pid_jobs[jobs_num--]=0;
    }
    else
    printf("error \n");
    return 0;
}   
//可見,後臺運行與前臺運行的區別只在於前臺運行等待子進程的退出而阻塞父進程操作。而後臺運行時,可以在父進程中輸入命令繼續其他操作。本質上沒有區別,都是給子進程發送SIGCONT信號
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章