gpt4 book ai didi

在c中捕获ping的输出

转载 作者:IT王子 更新时间:2023-10-29 00:23:57 25 4
gpt4 key购买 nike

如何通过管道立即捕获 ping 命令的输出?

这是我的代码:

int main ()
{
FILE *cmd = popen ( "ping -c 3 google.com | grep icmp", "r" );//ping google
char *s = malloc ( sizeof ( char ) * 200 );
while ( 1 )
{
fgets ( s, sizeof ( char )*200, cmd );
printf ( "%s", s);//show outcome
if ( strstr ( s, "icmp_req=3" ) != 0 )
break;
}
pclose ( cmd );
return 0;
}

当程序结束时,它会同时显示输出。但我想在程序执行时立即读取输出。

最佳答案

<stdio.h>默认情况下被缓冲,并且 stdout是行缓冲的。

替换你的 printf("%s", s);printf("%s\n", s); (结束换行符将刷新 stdout 缓冲区)或添加对 fflush(NULL); 的调用就在它之后。

其实你的问题与ping无关, 但管道是缓冲的。

你可能会做较低级别的 pipe , fork , dup2 , read系统调用并显式管理管道上的缓冲区。然后调用poll可能会有用。

您可以考虑使用像 liboping 这样的 ICMP ping 库或者考虑改为执行 HTTP 请求(使用 wget 程序,或者最好使用 libcurl ;也许一个简单的 HTTP HEAD 请求就足够了)。作为一般建议,避免使用 popen fork 进程或 system (因为目标计算机上可用的命令可能不同)。

阅读一些不错的 Linux 编程书籍,例如 http://advancedlinuxprogramming.com/

关于在c中捕获ping的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14452799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com