(내 말이 맞지 않으면 내 말이 맞다.) 그래서 파일 설명자에서 읽을 필요가 있지만 읽기 방법은 바이트 크기를 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을 넘는 크기를 처리하고 있습니다.
버퍼를 주어진 시간에 처리 할 준비가 된 데이터 덩어리의 크기로 만든 다음 그 정도를 반복해서 처리하십시오. 또는 fd를 fdopen()하면 fd를 얻을 수 있고 그것에 fscanf()를 사용할 수 있습니다. –
사이드 노트 -'i ++'와'i -'를 사용하는 pfd initialisaion 트릭이 옳지 않습니다. – keltar
입력 데이터의 예를 게시 할 수 있습니까? – ryyker