2013-03-08 4 views
2

최근 우리 그룹이 자주 사용하는 응용 프로그램 중 하나를 사용자 지정하는 작업을했습니다. 이 응용 프로그램은 C로 작성된 것으로, 많은 경험이 없지만 기능적인 예를 발견했습니다. 그러나 아직 테스트 베드에 완전히 통합 할 수 없었습니다.C의 FIFO (named pipe)

요구 사항은 매우 간단합니다. 명명 된 파이프를 열고 일부 데이터를 밀어서 다른 그룹이 파이프를 읽고 무엇인가 할 수 있도록합니다. 이것은 서버가 그 일을하는 것을 방해하지 않도록 이루어져야합니다.

내 응용 프로그램에는 history라는 배열이 있으며 여기에는 필요한 모든 값이 들어 있습니다. 나는 지금까지 이것을 달성하기위한 나의 시도와 결과가 엇갈 렸습니다. 대신 fprintfwrite을 사용할 때 이전에 일부 성공을 거두었

DCmass_add_history(history, history_num); 

int fd; 
char * myfifo = "/tmp/fooPipe"; 

/* create the FIFO (named pipe) */ 
mkfifo(myfifo, 0666); 

/* open FIFO (named pipe) */ 
fd = open(myfifo, O_WRONLY); 
    for (i = 0; i < history_num; i++) { 

    /* Write our data to our FIFO (named pipe) */ 
    fprintf(fd, "%d %d %f %f", history[i].id, history[i].clock, history[i].value, history[i].ns); 

} 
close(fd); 

하지만 내 파이프에 어떤 변수를 가져올 수 없습니다 : 코드 조각 아래를 참조하시기 바랍니다.

이전 스택 오버플로 예제에서 Stack Overflow example 나는 내 파이프를 테스트하기 위해 기본 판독기를 얻을 수 있었고 위의 기본 코드는 내 파이프를 열 수있었습니다.

+4

'는 fprintf를 w'소요 'FILE *'; 'int' 서술자가 아닙니다. – WhozCraig

답변

3

fprintf() 줄에받은 경고는 힌트 여야합니다.

FILE *fd = fopen(myfifo, "w"); 

fclose()를 사용하여 닫습니다 당신이 fprintf()를 사용하려면

, 당신은 fopen()하지 open()을 사용하기위한 FILE *을 열 수 있습니다.

0

버퍼링을 엄격하게 제어해야합니다. setlinebuf() 도움이 될 것이라고 생각하지만, 항상 snprintf()를 사용하여 변수를 버퍼에 형식화하고 write()를 사용하여 완전히 제어 할 수 있습니다. 한 번에 전체 줄을.

printf()가 큰 버퍼 일 때 setlinebuf()없이 충분한 행이 누적되면 행의 일부만 서식을 지정합니다. 명시 적으로 write()를 사용하여 원자 쓰기를 보장 할 수있을만큼 작은 버퍼 (로컬 OS에서 한계를 확인)를 사용하면 어떤 줄도 분리되지 않을 수 있습니다.

독자의 \ n으로 독서 계속 같은 분할 선을 통지 FIFO를 읽을 때 매우 조심해야하지만 경우에, 모두가 여기에 적절하게주의하고 그러한 문제

0

당신은 다음과 같이 쓸 수있을 수 있습니다 당신이 FifoFile

char * mesg; 
// allocating for mesg; and then 

sprintf(msg, "%d %d %f %f", history[i].id, history[i].clock, history[i].value, history[i].ns); 

write(fd, msg, sizeof(msg)); 
나는 희망

를 사용하려면, 당신을 위해 도움이!

0

이것은 당신이 파일의 임무 TEMP.TXT, 데이터베이스와 같은

FILE *fd = fopen(fileName , option); 

파일 이름을

int fd; 

을 원하는 제공하지 않습니다.TXT는

옵션 - R (읽기)는

-w는 (쓰기)

은 -r +과 + (작성에 마지막으로 읽은 줄에서 텍스트 추가)) (

관련 문제