inetd으로 로그를 뿌려주는 프로그램을 만들고 싶습니다.

purewell의 이미지
7344
points
0
points

OS: SunOS 5.8

/etc/inetd.conf 마지막에 아래와 같은 줄을 추가하였습니다.

viewlog         stream  tcp     nowait  purewell    /export/home/purewell/bin/in.viewlog in.viewlog

in.viewlog는 다음과 같은 스크립트입니다.

#!/bin/sh

tail -10000f /var/log/myserver.log | awk '{print $1}' | /export/home/purewell/bin/viewlogd

viewlogd.c는 다음과 같은 C소스를 컴파일한 것입니다.

#include <stdio.h>

int
main(int argc, char* argv[])
{
        char buf[102400];
        const int bufsize = sizeof(buf);
        int rsize;

        while (!feof(stdin) && !feof(stdout) && !feof(stderr))
        {
                fputc(fgetc(stdin), stdout);
                fflush(stdout);
        }

        return 0;
}

$ gcc -O3 -o -static viewlogd viewlogd.c

로그 파일은 3-40메가입니다.

$ ./in.viewlog 또는 telnet localhost 9989

위와 같이 입력하면 로그파일을 주르르르르르~ 뿌려줍니다. 문제는 tail -f인데도 불구하고 로그를 계속 뿌려주지 않습니다.
트래이스 해보면 fgets에서 멈춰있습니다.

in.viewlog 안에 명령 줄 가운데 맨 끝에 '| /.../viewlogd' 이 부분을 제거하면 제대로 출력은 되는데 텔넷으로 연결했을 경우 tail과 awk 프로세스가 죽지 않습니다.

왜 fgets에서 멈춰 있는 것일까요?