我是C语言的新手,今天,在尝试关闭使用popen函数创建的“开放流”时遇到了问题。
1.是否由于我在该程序中使用的轮询功能而看到此问题?
2.还是因为fcntl函数?
如果有人教我这个问题的确切原因,我将非常高兴。我附上以下代码示例,请看一看。
代码示例:
#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);
}
输出:
[root@localhost 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****************.
在这里,我希望提示符出现在执行的结尾。但是,它不会到来。
最佳答案
您超时,因为tail在10秒钟内未产生任何输出。然后调用pclose(),但这就是文档中关于pclose()的内容。
pclose()函数等待关联的进程终止,并返回由wait4(2)返回的命令的退出状态。
tail命令仍在运行,并且将继续这样做,直到有人将其杀死为止,因此pclose()将无限期地阻塞。如果您需要程序终止正在运行的tail命令,则除了使用popen / pclose外,还需要另一种方法。
关于c - 无法关闭使用Popen打开的文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11334831/