2011-02-03 32 views
1

我試圖暫停該過程,但它不起作用。 這是代碼的一部分。有Ctrl + Z和Ctrl + C。 Ctrl + C正在工作。我不明白爲什麼用Z它不起作用。 (實際的代碼):如何處理mini-shell中的Ctrl + Z信號。 C

//ctrl+Z 
void sigstop(int p){ 
    signal(SIGTSTP,&sigstop); 
    kill(my_pid,SIGSTOP); 

    fflush(stdout); 
} 

// Ctrl+C 
void sigkill(int p){ 
    signal(SIGINT,&sigkill); 
    kill(my_pid,SIGKILL); 

    fflush(stdout); 
} 

代碼中的主要方法:

... 
my_pid = fork();  
if (my_pid == 0) { 
    signal(SIGTSTP,&sigstop);  //for Ctrl+Z 
    signal(SIGINT,&sigkill);  //for Ctrl+C 

    checkCommand();   
    execvp(argv[0], argv); 
    exit(getpid());  
} 
+0

你不應該叫'fflush`上`stdin`,因爲這是不確定的行爲。 – fouronnes 2011-02-03 20:25:34

+0

你的`sigstop`和`sigkill`函數需要一個`int`參數:你的編譯器應該給你警告錯誤的函數簽名。 – 2011-02-03 20:26:51

回答

2

相反爲SIGTSTPSIGINT安裝信號處理程序,把端子插入原始模式與cfmakerawtcsetattr^C^Z然後可以作爲普通字符讀取,這應該不太麻煩。但是,您需要自行執行行編輯 - GNU readline是您的朋友。有關進一步的建議,請參閱GNU C Library ManualImplementing a ShellJob Control部分。 (你可以放心地忽略它試圖警告你內核不支持作業控制的部分 - 如果任何人仍然在使用這些系統中的任何一個,他們只能責怪它。)

0

我認爲在sigkill函數中調用kill(),只是開始一個無限遞歸循環,其中kill()只是再次調用sigkill函數,它調用kill(),再次調用sigkill函數...等等。不要調用kill(),請設置一個全局布爾變量並在主函數中檢查它。如果設置了這個全局布爾變量,那麼您只需優雅地退出。

喜歡的東西:

volatile bool gTerminate = false; 

void sigkill(int p) 
{ 
    gTerminate = true; 
    signal(SIGINT, &sigkill); 
} 

int main(...) 
{ 
    //initialization stuff... 

    while(!gTerminate) 
    { 
     //do stuff 
    } 

    return -1; 
}