在多進(jìn)程的程序中,,我們可以使用函數(shù)wait或waitpid在父進(jìn)程里接收子進(jìn)程的退出狀態(tài),,如下面的代碼所示: int status; if (fork() = = 0) // 子進(jìn)程 exit(0); } 整型變量status里保存的就是子進(jìn)程退出時(shí)的狀態(tài)。根據(jù)子進(jìn)程結(jié)束的方式,,其退出狀態(tài)分為兩種:一,、正常退出 二、被信號(hào)結(jié)束,。對(duì)于第一種情況,,如果子進(jìn)程的代碼里顯式調(diào)用了函數(shù)exit(n)/_exit(n)/return (n)時(shí),status里就包含了值n,;否則的話,,status里包含的值就等于子進(jìn)程執(zhí)行的最后一條語(yǔ)句的返回值。 對(duì)于第二種情況,,status里包含的值就等于中斷該子進(jìn)程的信號(hào)的編號(hào)即信號(hào)類(lèi)型,。 我們可以使用系統(tǒng)中定義的宏來(lái)判斷并顯示status的值,如下所示: if( WIFEXITED(status) ) printf(“exit normally! The return code is %d\n”, WEXITSTATUS(stat)); else if( WIFSIGNALED(status)) printf(“exit abnormally! The signal code is %d\n”, WTERMSIG(stat)); 相關(guān)宏的定義如下: #define __WAIT_INT(status) status #define WIFEXITED(status) __WIFEXITED(__WAIT_INT(status)) #define __WIFEXITED(status) (__WTERMSIG(status) == 0) #define __WTERMSIG(status) ((status) & 0x7f) #define WEXITSTATUS(status) __WEXITSTATUS(__WAIT_INT(status)) #define __WEXITSTATUS(status) (((status) & 0xff00) >> 8) 由此可見(jiàn),,當(dāng)子進(jìn)程正常結(jié)束時(shí),,返回值保存在status的倒數(shù)第二個(gè)字節(jié)里,此時(shí)最低字節(jié)里的值應(yīng)為0,; 當(dāng)子進(jìn)程被信號(hào)終止時(shí),,對(duì)應(yīng)的信號(hào)的類(lèi)型就保存在status的最低字節(jié)里。 |
|