waitpid函式如下
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
功能:
等待子行程終止,如果子行程終止了,此函式會回收子行程的資源。
引數:
pid : 引數 pid 的值有以下幾種型別:
pid > 0 等待行程 ID 等于 pid 的子行程。
pid = 0 等待同一個行程組中的任何子行程,如果子行程已經加入了別的行程組,waitpid 不會等待它。
pid = -1 等待任一子行程,此時 waitpid 和 wait 作用一樣。
pid < -1 等待指定行程組中的任何子行程,這個行程組的 ID 等于 pid 的絕對值。
status : 行程退出時的狀態資訊。和 wait() 用法一樣。
options : options 提供了一些額外的選項來控制 waitpid()。
0:同 wait(),阻塞父行程,等待子行程退出。
WNOHANG:沒有任何已經結束的子行程,則立即回傳。
WUNTRACED:如果子行程暫停了則此函式馬上回傳,并且不予以理會子行程的結束狀態。(由于涉及到一些跟蹤除錯方面的知識,加之極少用到)
回傳值:
waitpid() 的回傳值比 wait() 稍微復雜一些,一共有 3 種情況:
1) 當正常回傳的時候,waitpid() 回傳收集到的已經回收子行程的行程號;
2) 如果設定了選項 WNOHANG,而呼叫中 waitpid() 發現沒有已退出的子行程可等待,則回傳 0;
3) 如果呼叫中出錯,則回傳-1,這時 errno 會被設定成相應的值以指示錯誤所在,如:當 pid 所對應的子行程不存在,或此行程存在,但不是呼叫行程的子行程,waitpid() 就會出錯回傳,這時 errno 被設定為 ECHILD;
關于WUNTRACED引數的問題,若子行程暫停了則馬上回傳。
問題1:
行程暫停是什么狀態,就緒態?,阻塞態?,掛起態?
問題2:
行程在I\O請求時由執行態轉為阻塞態,scanf函式算I\O請求嗎?
問題3:
waitpid在設定WUNTRACED引數下,當子行程停止時的回傳值是什么?
測驗代碼如下:
#include"basic.h"
int main()
{
pid_t pc, pr;
int status;
int enter;
pc=fork();
if(pc<0) /* 如果fork出錯 */
{
perror("Error occured on forking");
}
else if(0 == pc) /* 如果是子行程 */
{
sleep(3); /* 睡眠10秒 */
printf("this is son process\n");
fflush(stdout);
scanf("%d",&enter);
printf("enter is %d\n",enter);
printf("son process end");
exit(0);
}
/* 如果是父行程 */
do{
pr=waitpid(-(getpid()),&status, WUNTRACED);
if(pr==0) /* 如果沒有收集到子行程 */
{
perror("No child exited");
sleep(1);
}
if(-1 == pr)
{
perror("waitpid fail");
}
}while(pr == 0); /* 沒有收集到子行程,就回去繼續嘗試 */
if(pr == pc)
{
printf("successfully get child %d\n", pr);
if(WIFEXITED(status) != 0)
{
printf("son process return : %d\n",WEXITSTATUS(status));
}
}
else
{
printf("some error occured\n");
}
}
請大佬幫忙改進能實作對WUNTRACED引數的測驗。
請大佬解惑,謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/64587.html
標籤:C語言
下一篇:撰寫一個選單
