C 来自Shell的警告将在服务器端而不是客户端打印出来

C 来自Shell的警告将在服务器端而不是客户端打印出来,c,sockets,client,popen,C,Sockets,Client,Popen,正如您在下面看到的,代码似乎是正确的——但有一件小事困扰着我。为了这个例子,我特意将popen中的命令改为ls-s(在我的例子中,它不是目录!)。shell(?)打印出它的错误/警告消息:ls:s:没有这样的文件或目录,但它是在服务器端执行的!似乎很奇怪,每一个成功的命令都被编写并发送到客户端,但错误和警告却没有。我怎样才能解决这个问题 FILE *fp = NULL; fp = popen("ls s", "r") // Inserting "ls s" as command. char

正如您在下面看到的,代码似乎是正确的——但有一件小事困扰着我。为了这个例子,我特意将popen中的命令改为
ls-s
(在我的例子中,它不是目录!)。shell(?)打印出它的错误/警告消息:
ls:s:没有这样的文件或目录
,但它是在服务器端执行的!似乎很奇怪,每一个成功的命令都被编写并发送到客户端,但错误和警告却没有。我怎样才能解决这个问题

FILE *fp = NULL;
fp = popen("ls s", "r") // Inserting "ls s" as command. 

char path[100];
char* buffer = malloc(sizeof(char) * 1024);

while (fgets(path, 100, fp) != NULL){
   strcat(buffer, path);
}

write(connected, buffer, strlen(buffer));

free(buffer);

pclose(fp);

它们被写入
stderr
,而您只读取
stdout
。使用重定向。@user58697好的,所以我尝试执行
dup2(已连接,文件号(stderr))
它有点接近,但它将首先打印出
ls:
,然后在第二次写入
s:没有这样的文件或目录
,这将导致我的所有命令被迫后退一步。例如:如果我键入ls,什么也不会发生,但如果我再次键入a,ls将写入客户端,是的,所有内容基本上都落后一步。请尝试
popen(“ls s 2>&1”,“r”)
@user58697哦,哇,谢谢你,伙计!编辑:啊,非常感谢。已经磨了两天了!