C popen的输出不';无法捕获错误返回
我试图从C popen的输出不';无法捕获错误返回,c,linux,C,Linux,我试图从popen捕获输出 我使用的命令是 timeout 1.5 ping -c 1 1.2.3.4 -w 2 | tail -1 | awk '{print $4}' | cut -d '/' -f 2 2>&1 如果在shell中执行上述命令,将收到一条消息Terminated。我的目标是在缓冲区中终止消息。我使用了下面的代码,但不起作用 #include <stdio.h> #include <string.h> #include <pt
popen
捕获输出
我使用的命令是
timeout 1.5 ping -c 1 1.2.3.4 -w 2 | tail -1 | awk '{print $4}' | cut -d '/' -f 2 2>&1
如果在shell中执行上述命令,将收到一条消息Terminated
。我的目标是在缓冲区中终止消息。我使用了下面的代码,但不起作用
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
char pingTimeToServer[256];
char *gateway = NULL;
char cmd[256] = {0x0};
char receiver_gateway[256];
char c[1000];
int main() {
strcpy(pingTimeToServer,"TEST");
FILE *fp;
//snprintf(cmd, sizeof(cmd), "timeout 1.5 ping -c 1 %s -w 2 | tail -1 | awk '{print $4}' | cut -d '/' -f 2", "1.2.3.4");
//snprintf(cmd, sizeof(cmd), "timeout 1.5 2>&1 ping -c 1 %s -w 2 | tail -1 | awk '{print $4}' | cut -d '/' -f 2", "1.2.3.4");
snprintf(cmd, sizeof(cmd), "timeout 1.5 ping -c 1 %s -w 2 | tail -1 | awk '{print $4}' | cut -d '/' -f 2 2>&1", "1.2.3.4");
if ((fp = popen(cmd, "r")) == NULL)
{
return -1;
}
while(fgets(pingTimeToServer, sizeof(pingTimeToServer), fp) != NULL)
{
printf(" inside IF .................. \n");
pingTimeToServer[strcspn(pingTimeToServer, "\r\n")] = '\0';
}
printf("********** pingTimeToServer is %s\n",pingTimeToServer);
pclose(fp);
}
#包括
#包括
#包括
#包括
char pingTimeToServer[256];
char*gateway=NULL;
char cmd[256]={0x0};
字符接收器_网关[256];
字符c[1000];
int main(){
strcpy(pingTimeToServer,“TEST”);
文件*fp;
//snprintf(cmd,sizeof(cmd),“超时1.5 ping-c1%s-w2 | tail-1 | awk'{print$4}'| cut-d'/'-f2”,“1.2.3.4”);
//snprintf(cmd,sizeof(cmd),“超时1.52>和1 ping-c1%s-w2 | tail-1 | awk'{print$4}'| cut-d'/'-f2”,“1.2.3.4”);
snprintf(cmd,sizeof(cmd),“超时1.5 ping-c1%s-w2 | tail-1 | awk'{print$4}'| cut-d'/'-f2>&1”,“1.2.3.4”);
if((fp=popen(cmd,“r”))==NULL)
{
返回-1;
}
while(fgets(pingTimeToServer,sizeof(pingTimeToServer,fp)!=NULL)
{
printf(“如果………..\n”,则为内部);
pingTimeToServer[strcspn(pingTimeToServer,“\r\n”)]='\0';
}
printf(“******pingTimeToServer是%s\n”,pingTimeToServer);
pclose(fp);
}
你知道为什么它不起作用吗?或者,如果有更好的方法在C中实现,这也会很有帮助 只有在交互模式下运行时,shell才会打印消息。因此,您需要使用-i
运行一个shell进程来获取消息
snprintf(cmd, sizeof(cmd), "bash -i -c 'timeout 1.5 ping -c 1 %s -w 2 | tail -1 | awk '\\''{print $4}'\\'' | cut -d \"/\" -f 2' 2>&1", "1.2.3.4");
只有在交互模式下运行时,shell才会打印消息。因此,您需要使用-i
运行一个shell进程来获取消息
snprintf(cmd, sizeof(cmd), "bash -i -c 'timeout 1.5 ping -c 1 %s -w 2 | tail -1 | awk '\\''{print $4}'\\'' | cut -d \"/\" -f 2' 2>&1", "1.2.3.4");
Terminated
消息来自shell本身,而不是任何程序,因此不会重定向。此外,它只在交互式shell中打印该消息。Terminated
消息来自shell本身,而不是任何程序,因此不会重定向。此外,它只在交互式shell中打印该消息。