2016-10-04 69 views
2

follwing代碼已經寫入,用於在Linux中使用sysyem調用來打開文件並將數據寫入終端。C(文件描述符)中的系統調用

要讀取文件描述符(fd)的值,應該指定一個值。正如我們在if else語句中所知道的那樣,如果其他部分或者第一部分將一次執行。所以根據下面的代碼fd只有在else時纔有一個值。但是當我傳遞文件名並運行該程序時,它會打開文件。文件打開發生在read(()系統調用的while循環中,但while循環處於其他部分,因爲文件描述符在理論上不能有任何值,所以read函數如何才能完全識別文件?這讓我感到困惑。

#include <stdio.h> 
    #include <fcntl.h> 
    #include <stdlib.h> 
    #include <unistd.h> 

    #define SIZE 10 

    int main(int argc, char *argv[]) 
    { 
     int fd,n; 
     char buff[SIZE]; 

     if(argc != 2) 
     { 
      printf("USAGE : %s\n",argv[0]); 
      exit(1);   
     }   
     else if ((fd = open(argv[1],0)) == -1) 
     { 
      perror("STATUS"); 
      exit(1); 
     } 
     else 
     { 
      while((n = read(fd,buff,SIZE)) > 0) 
      { 
       write(1,buff,SIZE); 

      } 
      close(fd); 
     }   
    } 
+0

'else if((fd = open(argv [1],0))== -1)''fd'具有從'open'返回的值。這就是C中的事情。學習如何使用調試器並逐步完成該程序,您就會明白。 –

+0

函數:'read()'返回'ssize_t',而不是'int'。 – user3629249

+0

當輸出一個錯誤信息時,它應該輸出到'stderr',而不是'stdout'。因此,建議您的錯誤消息類似於:'fprintf(stderr,「USAGE:%s \ n」,argv [0]);' – user3629249

回答

2

繼發生在這裏:

讓我們假設在程序啓動的命令行上xyz.txt將該,讓我們假設xyz.txt將該文件不存在:

if(argc != 2) 
{ 
             // we don't get here because argc == 2 
    printf("USAGE : %s\n",argv[0]); 
    exit(1); 
} 
else if ((fd = open(argv[1],0)) == -1) // the statement in the if clause will therefore 
             // be executed, fd will be something different 
             // from -1 because open succeeded 
{ 
    perror("STATUS");     // therefore we dont ge here either 
    exit(1); 
} 
else 
{          // instead we get here and 
    while((n = read(fd,buff,SIZE)) > 0) // everything works as expected 
    { 
     write(1,buff,SIZE); 

    } 
    close(fd); 
}