0

我是 C 语言的新手,今天,我在尝试关闭使用 popen 函数创建的“Open Stream”时遇到了一个问题。1. 这个问题是不是因为我在这个程序中使用了 poll 函数?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****************.

在这里,我希望提示出现在执行结束时。但是,它不会到来。

4

2 回答 2

1

你得到一个超时,因为 tail 在 10 秒内没有产生任何输出。然后你调用 pclose() ,但是,这就是文档中关于 pclose() 的内容。

pclose() 函数等待相关进程终止并返回由 wait4(2) 返回的命令的退出状态。

tail 命令仍在运行,并且会继续运行,直到有人杀死它,所以 pclose() 将无限期地阻塞。如果您需要您的程序来终止您正在运行的 tail 命令,您将需要另一种方法,而不是使用 popen/pclose。

于 2012-07-04T20:26:12.810 回答
1

-f 选项导致 tail 在到达文件末尾时不停止,而是等待附加数据附加到输入。如果标准输入是管道,则忽略 -f 选项,但如果它是 FIFO,则不会。

pclose() 函数等待关联进程终止;它返回命令的退出状态,由 wait4(2) 返回。

pclose() 函数返回 -1 如果流没有与“弹出”命令关联,如果流已经“pclose”,或者如果 wait4(2) 返回错误。

检查 pclose() 的返回值。

于 2012-07-04T20:31:00.637 回答