APUE學習筆記-system、pr-exit(打印wait函數返回的終止狀態)

#include "myapue.h"
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>

void pr_exit(int status);
int system(const char *cmdstring);

int main(void)
{
	int status;

	if((status = system("date")) < 0)
		err_sys("system() error");	
	    
	pr_exit(status);//正常執行,正常退出

	if((status = system("nosuchcommand")) < 0)
		err_sys("system() error");	
	
	pr_exit(status);//exec失敗(表示不能執行shell,其返回值如同shell執行了exit(127))

	if((status = system("who; exit 44")) < 0)
		err_sys("system() error");	
	
	pr_exit(status);//who正常執行,以後執行exit 44退出shell
}

<212>
shell

int system(const char *cmdstring)
{
	pid_t pid;
	int status;

	if(cmdstring == NULL) 
		return(1);

	if((pid = fork()) < 0)
		status = -1;
	else if(pid == 0){
		execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
		_exit(127);
	}
	else{
		while(waitpid(pid, &status, 0) < 0){
			if(errno != EINTR){
				status = -1;
				break;
			}
		}
	}
	
	return(status);
}

(1)<212>函數

execl函數:取路徑名做爲參數,(l表示列表list:要求將新程序的每一個命令行參數都說明爲一個單獨的參數,並以空指針結尾)spa

execlp函數:以文件名做爲參數。命令行

shell的-c選項告訴shell程序取下一個命令行參數做爲命令輸入。(cmdstring)指針

(2)code

調用_exit函數,而不是exit函數,防止任一標準I/O緩衝在子進程中被沖洗。orm

(3)進程

使用system而不是直接使用fork和exec的優勢是,system進行了所需的各類出錯處理,以及各類信號處理。cmd


<191>string

void pr_exit(int status)
{
	if(WIFEXITED(status))
		printf("normal termination, exit status = %d\n", WEXITSTATUS(status));
	else if(WIFSIGNALED(status))
		printf("abnormal termination, signal number = %d%s\n", WTERMSIG(status),
#ifdef WCOREDUMP
		WCOREDUMP(status) ? " (core file generated)" : "");
#else
		"");
#endif	
	else if(WIFSTOPPED(status))
		printf("child stopped, signal number = %d\n", WSTOPSIG(status));
}

(1)

wait和waitpid返回的終止狀態,用定義在<sys/wait.h>中個各個宏來查看。有4個互斥的宏可用來取得進程終止的緣由。

WIFEXITED(status):若爲正常終止子進程返回的狀態,則爲真。

                   WEXITSTATUS(status):獲取子進程傳送給exit或_exit參數的低8位。

WIFSIGNALED(status):若爲異常終止子進程返回的狀態,則爲真(接到一個不捕捉的信號)。

                         WTERMSIG(status):獲取子進程終止的信號編號。

                         WCOREDUMP(status):若已產生終止進程的core文件,則返回真。(使用前檢查是否認義宏#ifdef WCOREDUMP)

WIFSTOPPED(status):若爲當前暫停子進程的返回狀態,則爲真。

                   WSTOPSIG(status):獲取使子進程暫停的信號編號。

相關文章
相關標籤/搜索