2014-07-23 3 views
0

(내 말이 맞지 않으면 내 말이 맞다.) 그래서 파일 설명자에서 읽을 필요가 있지만 읽기 방법은 바이트 크기를 int로 가져다가 그 정도를 읽거나 O_NONBLOCK을 사용할 수 있습니다 ,하지만 난 아직 알 수없는 크기의 버퍼 크기를 설정해야합니다. 어렵게 만듭니다. 내가 지금까지 무엇을 가지고 heres.C에서 파일 설명자에서 읽는

이것은 모든 폴링과 mkfifo를 처리하는 나의 방법이다. 및 N 이미 저는 다른 수신 데이터를 다시 동일하게 사용할 수있는 것을 의미 파이프를 비우고, 나도 한번()는 모든 데이터가오고 판독 읽어 선가 메인

struct pollfd pfd[N]; 
int i; 
for(i = 0; i < N; i++) 
{ 
    char fileName[32]; 
    snprintf (fileName, sizeof(fileName), "%d_%di", pid, i); 
    mkfifo(fileName, 0666); 
    pfd[i].fd = open(fileName, O_RDONLY | O_NDELAY); 
    pfd[i].events = POLLIN; 
    pfd[i].revents = 0; 

    snprintf (fileName, sizeof(fileName), "%d_%do", pid, i); 
    mkfifo(fileName, 0666); 
    i++; 
    pfd[i].fd = open(fileName, O_WRONLY | O_NDELAY); 
    pfd[i].events = POLLOUT; 
    pfd[i].revents = 0; 
    i--; 
} 
while(1) 
{ 
    int len, n; 
    n = poll(pfd, N, 2000); 
    if(n < 0) 
    { 
     printf("ERROR on poll"); 
     continue; 
    } 
    if(n == 0) 
    { 
     printf("waiting....\n"); 
     continue; 
    } 
    for(i = 0; i < N; i++) 
    { 
     char buff[1024]; <---i dont want to do this 

     if (pfd[i].revents & POLLIN) 
     { 
      printf("Processing input....\n"); 
      read(pfd[i].fd, buff, O_NONBLOCK); 
      readBattlefield(buff); 
      print_battleField_stats(); 
      pfd[i].fd = 0; 
     } 
    } 
} 

에 미리 정의된다. 하지만 그것은 같은 파이프를 다시 사용할 수 없기 때문에 파이프를 비우지 않습니다. 교수님 께 물어 보았지만 scanf와 비슷한 것을 쓰는 것이지만 scanf가 FILE 스트림을 취하고 poll.fd가 int 인 경우 scanf를 사용하는 방법은 무엇입니까? 본질적으로 나의 궁극적 인 질문은, 스캔 또는 다른 정렬을 사용하여 파일 설명자를 통해 들어오는 데이터를 읽는 방법입니까? 스캔을 사용하면 데이터 처리에 많은 도움이됩니다.

EDIT : 고양이 파일> (named_file) 을 입력해야하고 내 메인 프로그램이 입력 데이터를 읽습니다. heres는 입력 데이터

같은

3/3

1 2 0

0 2 0

3 0 0

제 2 개 번호는 이후 격자 정보 및 플레이어 수 있으며 모습 그리드입니다. 그러나이 단순화 된 버전은 1000 년대가 넘는 플레이어와 그리드의 100을 넘는 크기를 처리하고 있습니다.

+1

버퍼를 주어진 시간에 처리 할 준비가 된 데이터 덩어리의 크기로 만든 다음 그 정도를 반복해서 처리하십시오. 또는 fd를 fdopen()하면 fd를 얻을 수 있고 그것에 fscanf()를 사용할 수 있습니다. –

+0

사이드 노트 -'i ++'와'i -'를 사용하는 pfd initialisaion 트릭이 옳지 않습니다. – keltar

+0

입력 데이터의 예를 게시 할 수 있습니까? – ryyker

답변

2

char buff [1024]; < ---이 작업을 수행하고 싶지 않습니다.

무엇을 하시겠습니까? 이것이 작동하는 방식입니다. 이것은 어떻게 작동하는지 하지입니다 :

read(pfd[i].fd, buff, O_NONBLOCK); 

O_NONBLOCK 정수 #define 때문 컴파일하지만, 그것은 절대적으로 명백하게 잘못된 입니다. read()의 세 번째 인수는 읽을 바이트 수입니다. 깃발이 아닙니다. 기간. 0 일 수도 있지만 여기에서 수행 한 작업은 임의의 숫자를 전달하는 것입니다. O_NONBLOCK의 값은 무엇이든간에 쉽게 버퍼 크기보다 클 수 있습니다. 이 은 읽기가 아닌 블록을 설정하지 않습니다. recv()read()과 유사하며 네 번째 인수와 같은 플래그를 사용하지만 파일 설명자와 함께 사용할 수는 없습니다. 파일 설명 자에 비 블록을 설정하려면 open() 또는 fcntl()을 사용해야합니다.

스캔 또는 다른 정렬을 사용하여 파일 설명자를 통해 들어오는 데이터를 읽는 방법은 무엇입니까?

fdopen()으로 열린 설명자에서 FILE* 스트림을 만들 수 있습니다.

나는 또한 read()가 모든 데이터를 읽으면 파이프를 비 웁니다. 즉, 다른 들어오는 데이터에 대해 동일한 것을 다시 사용할 수 있다는 것을 의미합니다. 하지만 그것은 같은 파이프를 다시 사용할 수 없기 때문에 파이프를 비우지 않습니다.

(작성자가 연결을 종료했기 때문에) read()은 0을 반환하고 누군가가 파이프를 다시 열 때까지 즉시 0을 계속 반환합니다.

설명자를 비 블록으로 설정하면 read()은 항상 즉시 반환됩니다. 연결된 사람이 있고 읽을 상대가없는 경우 -1을 반환하지만 errno== EAGAIN이됩니다. man 2 read을 참조하십시오.

man fifo은 반드시 읽어야합니다. 확실하지 않은 것이 있으면 그 질문을 토대로 구체적인 질문을하십시오.

잊지 말고 read()을 호출하십시오. 그게 잘못입니다. W R O N G. 당신의 교수님/TA/그 누구도 놓치지 않을 것입니다.

+0

This; 나는 또 한번 read()가 모든 데이터를 읽었을 때 파이프를 비 웁니다. 즉, 다른 들어오는 데이터에 대해 동일한 것을 다시 사용할 수 있다는 의미입니다. 하지만 같은 파이프를 다시 사용할 수 없으므로 파이프를 비우지 않습니다. 확실히 사실이 아닙니다. 송신자가 파이프의 끝을 닫거나 수신자가 의도적으로 수신자를 닫지 않는 한 수신기는 파이프를 닫지 않습니다. – user3629249

+0

사실 나는 이것을 단지 시도했지만 EOF 이후에는 fd가 없어지는 것에 대해 틀렸다. 나는 그것을 바로 잡았다. 'read()'는 EOF에 도달하면 즉시 ** 0을 반환 할 것이다. (writer가 pipe를 닫았 기 때문에) 그러나 다른 writer가 write를 위해 pipe를 open()하면 파이프가 멈추고 계속 읽을 수있다. 새로운 작가로부터. – delicateLatticeworkFever

관련 문제