저는 C 언어를 처음 사용하며 오늘 popen 함수를 사용하여 만든 "Open Stream"을 닫으려고 할 때 문제가 발생합니다. 1.이 프로그램에서 사용한 폴 기능 때문에이 문제가 발생합니까? 2. 또는 fcntl 함수 때문에? 누군가가 내게이 문제의 정확한 원인을 가르쳐 준다면 나는 매우 기쁠 것입니다. 아래 코드 샘플을 첨부하려고합니다.popen을 사용하여 파일을 닫을 수 없습니다.
코드 샘플 :
#include <stdio.h>
#include <stdlib.h>
#include <poll.h>
#include <fcntl.h>
char line[1024];
FILE *tfd;
int readData(int *fd)
{
struct pollfd pfd;
int pollTime = 10000;
pfd.events = POLLIN;
pfd.fd = *fd;
int ret=1;
ret = poll(&pfd,1,pollTime);
printf("\nAfter ret=%d\n.",ret);
if(ret == -1 || ret ==0)
{
printf("Couldn't poll returned : %d\n", ret);
return 0;
} else {
if(fgets(line,sizeof(line),tfd) == NULL)
{
printf("\nReturns nothing.");
return 0;
}
printf("\nRead Some data.");
}
return ret;
}
void main(void)
{
int ret;
int fd, flags;
char filepath[] = "/home/TEST/";
char filename[] = "log.txt";
char cmd[100];
sprintf(cmd,"tail -f %s%s",filepath, filename);
tfd = popen(cmd, "r");
fd = fileno(tfd);
flags = fcntl(fd, F_GETFL, 0);
flags |= O_NONBLOCK;
fcntl(fd, F_SETFL, flags);
if(tfd==NULL)
{
printf("\npopen failed, exiting.\n");
exit(0);
}
while((ret=readData(&fd)) > 0)
{
printf("\nret2=%d.",ret);
printf("\nLine : %s",line);
}
printf("\n**********DONE****************.\n");
pclose(tfd);
}
출력 :
[[email protected] TEST]# ./polltail
After ret=1
.
Read Some data.
ret2=1.
Line : 64 bytes from maa03s05-in-f4.1e100.net (74.125.236.68): icmp_req=31 ttl=52 time=38.4 ms
After ret=0
.Couldn't poll returned : 0
**********DONE****************.
여기 내가 실행의 끝 부분에 나타나는 프롬프트를 기대하고있다. 그러나 그것은 오지 않을 것입니다.
안녕하세요, 매우 빠른 응답을 보내 주셔서 감사합니다. 스트림 파일을 닫기 전에이 꼬리 pid를 가져 오거나이 꼬리 처리를 어떻게 죽일 수 있습니까? – Sougrakpam
fork()/exec()를 사용하여 자식 프로그램을 직접 만들고 실행하고 pipe() 및 dup2()를 사용하여 자식 프로그램의 stdin/out/err과 통신하도록 filedescriptors를 설정해야합니다. 예제를 포함하고 그러한 개념을 설명하기 때문에 유닉스 프로그래밍에 관한 책이 가장 적합 할 것이다. – nos