c - 提示如何早于 popen 调用的标准输出出现?

标签 c pipe

我使用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/

相关文章:

c - Socket编程C(Linux Ubuntu)

c - 在C中实现管道

c - 使用管道,从父进程读取 2 个数字,子进程计算它们的总和并将结果提供给父进程进行打印

c++ - fork时产生的错误

c - 未定义对 `Function' C 的引用

c - 巨型迷宫的最短路径(HUGE)

过滤 RSS 提要以仅显示更受欢迎的链接

perl - 从 Perl 管道中读取不断输出的文本

c - 如何从 C 中的 char 数组中释放内存

c - 无法在 gtk3 c 程序中连接来自 Glade 的回调函数