next up previous contents
Next: STDOUT 與 STDERR Up: main 函式 Previous: 錯誤處理   Contents

錯誤碼 errno

  1. C 語言內建錯誤處理函式,include 標頭檔為 errno.h,其中 全域變數 errno 可判斷是何種錯誤?
  2. 沒錯誤時變數 errno 為 0,錯誤則有各種不同的訊息,可用 man 3 error 查詢各種錯誤,以下僅過濾三種錯誤。
    [dywang@dyw219 zzz]$ man 3 errno | col -b | grep -E '^\s+E(PERM|NOENT|ACCES)'
           EACCES	       Permission denied (POSIX.1)
           ENOENT	       No such file or directory (POSIX.1)
           EPERM	       Operation not permitted (POSIX.1)
    
  3. 範例:rename 改檔案名稱。
    [dywang@dyw219 zzz]$ vim mainfun3.c
    [dywang@dyw219 zzz]$ cat mainfun3.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 ) {
    		printf("File renaming error ");
    		switch(errno) {
    			case EPERM:
    				printf("%d: Operation not permitted\n", errno);
    				break;
    			case ENOENT:
    				printf("%d: File not found\n", errno);
    				break;
    			case EACCES:
    				printf("%d: Permission denied\n", errno);
    				break;
    			default:
    				printf("%d: Unknown error\n", errno);
    		}
    		return(2);
    	}
    	printf("%d: %s renamed to %s\n", errno, argv[1], argv[2]);
    
    	return(0);
    }
    
  4. 編譯
    [dywang@dyw219 zzz]$ gcc -o mainfun3 mainfun3.c
    
  5. 執行:檔案 a 改名為 b,回傳錯誤碼 2,表示檔案 a 不存在。
    [dywang@dyw219 zzz]$ ./mainfun3 a b
    File renaming error 2: File not found
    
  6. 執行:touch a 產生空檔案 a,成功將 a 改名為 b,回傳值為 0。
    [dywang@dyw219 zzz]$ touch a
    [dywang@dyw219 zzz]$ ./mainfun3 a b
    0: a renamed to b
    
  7. 執行:將 b 改為 /root 目錄下的 a,因一般用戶無法存取 /root 目錄,回傳值 13。
    [dywang@dyw219 zzz]$ ./mainfun3 b /root/a
    File renaming error 13: Permission denied
    
  8. 執行:將 /sbin/blkid 改名為 a,回傳值 18。
    [dywang@dyw219 zzz]$ ./mainfun3 /sbin/blkid a
    File renaming error 18: Unknown error
    



De-Yu Wang 2019-09-19