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中打印该消息。