next up previous contents
Next: 實機練習題 Up: main 函式 Previous: STDOUT 與 STDERR   Contents

錯誤訊息回傳函式 perror

  1. mainfunc3 及 mainfun4 程式判斷 errno 不等於 0 時,再判斷是何種錯誤來輸出錯誤訊息。但可能的錯誤種類很多,要一一列出會很麻煩,利用函式 perror() 回傳錯誤訊息,可以省掉判斷 errno 數字再輸出錯誤訊息的麻煩事,而且 perror 輸出在 STDERR。
  2. 範例:mainfun5.c 程式解決 mainfun3.c 的問題,程式更簡潔且適用範圍更廣。
    [dywang@dyw219 zzz]$ vim mainfun5.c
    [dywang@dyw219 zzz]$ cat mainfun5.c
    #include <stdio.h>
    #include <errno.h>
    
    int main( int argc, char *argv[] ) {
    	int result;
    
    	if(argc < 2) {
    		printf("Require TWO arguments\n" );
    		return(1);
    	}
    	result = rename( argv[1], argv[2] );
    	if( result != 0 ) {
    		perror("");
    		return(errno);
    	}
    	printf("%d: %s renamed to %s\n", errno, argv[1], argv[2]);
    
    	return(errno);
    }
    
  3. 編譯
    [dywang@dyw219 zzz]$ gcc -o mainfun5 mainfun5.c
    
  4. 執行:檔案 a 改名為 b,回傳錯誤碼 2,表示沒有這樣的檔案或目錄。
    [dywang@dyw219 zzz]$ ./mainfun5 a b
    No such file or directory
    [dywang@dyw219 zzz]$ echo $?
    2
    
  5. 執行:touch a 產生空檔案 a,成功將 a 改名為 b,回傳值為 0。
    [dywang@dyw219 zzz]$ touch a
    [dywang@dyw219 zzz]$ ./mainfun5 a b
    0: a renamed to b
    [dywang@dyw219 zzz]$ echo $?
    0
    
  6. 執行:將 b 改為 /root 目錄下的 a,因一般用戶無法存取 /root 目錄,回傳值 13。
    [dywang@dyw219 zzz]$ ./mainfun5 b /root/a
    Permission denied
    [dywang@dyw219 zzz]$ echo $?
    13
    
  7. 執行:將 /sbin/blkid 改名為 a,回傳值 18。
    [dywang@dyw219 zzz]$ ./mainfun5 /sbin/blkid a
    Invalid cross-device link
    [dywang@dyw219 zzz]$ echo $?
    18
    



De-Yu Wang 2019-08-14