我使用pipe编写了重定向代码,之后还使用popen编写了重定向代码。 我发现输出顺序很奇怪。
#include <stdio.h>
int main(){
FILE* fp;
fp=popen("mkpasswd -msha-512 -Sqwertyabc asdf","r");
char buf[120];
fscanf(fp,"%s",buf);
printf("result : %s\n",buf);
fp=popen("mkpasswd -msha-512 -Sqwertyabc","w");
fprintf(fp,"asdf");
//fflush(fp);
return 0;
}
~/workspace/tmp$ ./a.out
result : $6$qwertyabc$zctY7qCE/1e0b4iw0E.saKy6/QvVap4Ejdh16iTDc2dTM2n0tjtam/XikbYX02i/nnAjJopuIa2hQ.//wcZt80
~/workspace/tmp$ Password: $6$qwertyabc$.32ixI96wLr3h2nfYR9opTW3KFVuHWDFyI36JID.DI1riXs0glb/pzmNvdNEaoLDdEV3UkqxspBUruOzLMVMN/
无论我是否评论“fflush”,我的提示都会早于后一个“mkpasswd”调用的输出。
怎么会这样?我对此应该了解什么?
最佳答案
由于忘记关闭 popen
生成的文件而在上次打印的输出之前出现的提示。只需在 return 0;
之前添加 fclose(fp);
,所有内容都会按顺序打印。
但我认为您的代码中还有另外两个问题:
- 在第一个命令之后打开第二个命令之前未关闭
fp
会导致内存泄漏:FILE
对象使用的内存不再可访问 - 您在
mkpasswd
的标准输入上编写asdf
(在第二个命令中),但使用此语法mkpasswd
使用getpass
并直接读取/dev/tty
。您应该使用-s
标志在标准输入上读取
正确的代码应该是:
#include <stdio.h>
int main(){
FILE* fp;
fp=popen("mkpasswd -msha-512 -Sqwertyabc asdf","r");
char buf[120];
fscanf(fp,"%s",buf);
fclose(fp);
printf("result : %s\n",buf);
fp=popen("mkpasswd -s -msha-512 -Sqwertyabc","w");
fprintf(fp,"asdf");
fclose(fp);
return 0;
}
它给出
result : $6$qwertyabc$zctY7qCE/1e0b4iw0E.saKy6/QvVap4Ejdh16iTDc2dTM2n0tjtam/XikbYX02i/nnAjJopuIa2hQ.//wcZt80
$6$qwertyabc$zctY7qCE/1e0b4iw0E.saKy6/QvVap4Ejdh16iTDc2dTM2n0tjtam/XikbYX02i/nnAjJopuIa2hQ.//wcZt80
正确遵循提示。
关于c - 提示如何早于 popen 调用的标准输出出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26668810/