c - 为什么popen打开的文件是空的?

标签 c linux


尝试使用 c 获取 strace 命令的输出,我编写了以下代码片:

int main()
{
    FILE* pout;
    pout = popen("strace -fp 44030 2>&1 | grep write","r");

    char buff[1000];
    int d1,d2;
    while(1){
        if(fgets(buff,1000,pout)!=NULL)
        {
            printf("buff=%s\n",buff);
        }
        else
            continue;
    }
    pclose(pout);
}

当我在 shell 中运行所述命令时,我看到一些输出(44030 进程是在另一个终端中运行的 top 命令)。但运行程序时我什么也没看到。
此外,当我用 "strace -fp 44030 2>&1" 替换 popen 中的命令时,我通过运行程序看到 strace 命令的输出。我用另一段代码检查了 grep 和 popen 中的问题,并用 echo 命令替换了 strace。
我的问题出在哪里?我在哪里可以查找我的错误?
编辑:
当我等待一段时间后,那里有很多输出......我认为这是由于 grep 命令中的某种缓冲而发生的。

最佳答案

您只需在 grep 中禁用缓冲,可以使用 unbuffer 来实现。参见这里:https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

关于c - 为什么popen打开的文件是空的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40152972/

相关文章:

c - mmaping 大文件(用于持久性大数组)

c - 如何使内存总线饱和

c - 在 C 中对 OpenGL 捕获的缓冲区进行编码

linux - 将输出同时重定向到控制台和文件的命令在 bash 中运行良好。但我如何让它在 korn shell(ksh) 中工作

linux - 使用 Exagear 桌面将 XCTU 安装到 Raspbian Jessie

c - 了解 C malloc 和 sbrk()

c - 在服务器/客户端 tcp 实现中向每个订阅者发送通知的不同方式/方法

linux - 从 pcap_findalldevs() 过滤网络设备

linux - 无法插入某些 Linux 模块。各种错误

linux - 消除 VirtualBox 上的 emacs 中的 "File changed on disk"警告