2015-05-18 33 views
1

我會盡量保持簡單。我目前正在爲LINUX複製一個shell。我使用鏈表結構「job_list」來存儲所有後臺進程。如果後臺進程終止,那麼它將從列表中刪除。如果後臺進程掛起,則其列表中的狀態將從BACKGROUND更改爲STOPPED。如果進程被重新喚醒(通過SIGCONT信號),那麼想法是列表中的進程狀態應該改回到BACKGROUND。SIGCONT和LINUX中的waitpid()問題

我的問題如下:當我向進程發送一個SIGSTOP信號時,執行section // 1,並且它的狀態改變已成功註冊到列表中。但是,當我使用SIGCONT信號喚醒同一進程時,WIFCONTINUED(status)將返回false,但WIFEXITED(status)將始終返回true。因此,部分// 3將被執行,並且該進程將從列表中刪除。

什麼可能是錯的?提前致謝。

void sigchld_handler(){ 

block_SIGCHLD(); 


job *item; 
int l_size = list_size(job_list); 
int i, new_pid, pid_wait, status, info; 
enum status status_res; 

for (i = 1; i <= l_size; i++){ 



    item = get_item_bypos(job_list, i); 
    new_pid = item->pgid; 
    pid_wait = waitpid(new_pid, &status, WUNTRACED | WNOHANG); 



    if (WIFSTOPPED(status)){ 
     //1 
     printf("****SUSPENDED\n"); 
     item->state = STOPPED; 

    }else if (WIFCONTINUED(status)){ 
     //2 
     printf("****CONTINUED\n"); 
     item->state = BACKGROUND; 

    }else if (WIFEXITED(status)){ 
     //3 
     printf("****EXITED\n"); 
     l_size--; 
     i--; 
     delete_job(job_list, item); 

    } 
} 

print_job_list(job_list); 
unblock_SIGCHLD(); 

}

+0

您是否在'waitpid'調用中缺少'WCONTINUED'? –

+0

這樣一個簡單的解決方案......這正是問題所在。我寫了「waitpid(new_pid,&status,WUNTRACED | WNOHANG | WCONTINUED);」它的工作原理。非常感謝! – Forset1

回答

1

你似乎缺少您的來電waitpidWCONTINUED值。

waitpidspecification

pid_t waitpid(pid_t pid, int *stat_loc, int options); 

options參數從按位包容OR的下列標誌的零個或多個構成,在首部中定義:

WCONTINUED

waitpid()函數應報告由pid指定的任何繼續的子進程的狀態,該進程的狀態由於其持續未報告而未被報告一個工作控制停止。