2010-07-11 5 views
1

리눅스에서 간단한 데몬을 작성하려고합니다. FIFO를 작성한 다음 FIFO에 기록 된 데이터를 수집하고 나중에 해당 데이터를 파일에 기록합니다.유닉스 FIFO가 제대로 작동하는 데 문제가 있습니까?

일단 내 데몬이 FIFO를 만든 후에는 "echo text/myfifo"를 반복해서 수행 할 수 있습니다. 끝나면 "echo quit>/myfifo"를 수행 할 수 있으며 내 프로그램이 종료되고 모든 데이터가 디스크에 기록됩니다.

현재 FIFO에 더 많은 데이터가있는지를 알기 위해 poll()을 사용하고 있습니다. 이것은 FIFO에 데이터를 처음 반향시킬 때까지 정상적으로 작동합니다. 데이터가 잘 표시되지만 내 설문 조사 후에는 계속 SIGHUP을 반환합니다.

각 프로세스가 FIFO를 쓰고 난 후 FIFO를 재설정 (또는 닫으려면 & 다시 열어야합니까?)합니까? 내 코드의

의사 코드는 다음과 같습니다

ret = fifo(my_fifo, mode); 
fd = open(my_fifo, O_RDONLY | O_NONBLOCK); 

polling.fd = fd; 
polling.events = POLLIN | POLLPRI; 

do { 
    ret = poll(&polling, 1, -1); 
    amt = read(fd, buf, bufsize); 
    // do stuff 
} while (!done); 

답변

2

당신은 FIFO를 재개 유지해야, 나는 생각한다. I는 FIFO를 감시하는 프로그램을 가지며, 모니터 루프는 다음

/* Implement monitor mode */ 
void sql_monitor(char *fifo) 
{ 
    if (chk_fifo(fifo) != 0) 
     cmd_error(E_NOTFIFO, fifo); 

    /* Monitor -- device is assumed to be a FIFO */ 
    while (1) 
    { 
     ctxt_newcontext(); 
     if (ctxt_setinput(fifo) != 0) 
      sql_exit(1); 
     sql_file(); 
     ctxt_endcontext(); 
    } 
} 

ctxt_newcontext() 함수는 현재 I/O 상태를 숨겨 놨다; ctxt_setinput() 함수는 입력 파일을 지정된 파일 (이 경우 FIFO)로 설정합니다. sql_file() 함수는 끝에 도달 할 때까지 파일 (FIFO)에서 읽습니다. 파일이 닫힙니다. ctxt_endcontext()은 무엇을 ctxt_newcontext()가 실행 취소합니다. 이 프로세스는이 코드는 그래서 약 1990

이후 주변왔다 ... 반복, 은 YES, 당신은 폐쇄를 유지해야하고 각 프로세스 후 (예 : echo 완료를 파일의 끝을 읽은 후 FIFO를 재개한다 FIFO에 쓰기).

(데이터가 없을 때 프로세스가 수행하지 않는 한 실제로 FIFO를 폴링 할 필요가 없음을 알아야합니다. read() 호출은 데이터가 반환 될 때까지 대기합니다.)

+0

예, FIFO를 다시 열어야합니다. 많은 사람들은 동기화 모드에서 FIFO를 열면 다른 쪽에서도 FIFO가 열릴 때까지 차단된다는 것을 잊어 버릴 수 있습니다. 즉, 예를 들어, 셸 리디렉션. 그래서 그것은 마치 연결처럼 행동합니다. – Dummy00001

관련 문제