2016-10-04 4 views
2

다음 코드는 linux에서 sysyem 호출을 사용하여 파일을 열고 터미널에 데이터를 쓰도록 작성했습니다.C (File Descriptor)의 시스템 호출

파일 설명자 (fd)의 값을 읽으려면 값을 할당해야합니다. 우리가 알고있는 것처럼 else 문, else else part 또는 else part에서 한 번에 구현할 부분. 그래서 다음 코드에 따라 fd는 if if else 행에서만 값을 갖습니다. 그러나 파일 이름을 전달하고이 프로그램을 실행하면 파일이 열립니다. read() 시스템 호출에서 while 루프에서 파일 열기가 발생하지만 루프가 다른 부분에 있고 파일 설명자가 이론적으로 값을 가질 수 없기 때문에 읽기 기능이 파일을 정확히 인식합니까? .

#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()'는'int'가 아니라'ssize_t'를 반환합니다. – user3629249

+0

오류 메시지를 출력 할 때'stdout'가 아니라'stderr'에 출력해야합니다. 그러므로, 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); 
}