如何将system()中命令的stdout传递给self stdin?

时间:2018-06-26 10:01:23

标签: c linux

假设我打电话给类似的人

system("ls -1"); // argument minus-one puts one item per line

...我如何在调用进程stdin中捕获它?

据我所读,系统(在Linux中)打开一个bash提示符并尝试执行命令。这表明流程调用系统是父系统。 Reading about parent process pid suggest this is always 1111,但是我找不到确切的消息来源,只是Linux批评者说“做这个”,既没有解释也没有消息来源。

读取其他一些资源可以通过/proc/pid/fd/0

将数据传递到任意处理管道

基于阅读这些内容,我会认为:

system("ls -1 > /proc/1111/fd/0"); 

...完成此操作。但这似乎是我以前没有做过的事情,我的推论来源也不像我希望的那样正式。

那么,这是将系统命令输出传递到self stdin的一种便携式方法吗?

如果没有,我该怎么办?

1 个答案:

答案 0 :(得分:2)

似乎您正在尝试读取特定目录中所有文件/文件夹名称的列表。您的情况是当前工作目录。由于您尝试使用ls,因此您似乎也对* NIX解决方案感兴趣。

有很多方法可以将子过程的输出读取到父过程中。您可以对管道使用fork / exec,也可以使用popen

但是对于本示例,您无需进行ls的操作。您可以使用Linux API直接读取目录。

您需要使用功能opendirreaddir

考虑以下程序-

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    DIR *directory = opendir(".");
    if (directory == NULL)
        return EXIT_FAILURE;
    struct dirent * entry;
    while (entry = readdir(directory)) {
        printf("%s\n", entry->d_name);
    }
    closedir(directory);
    return 0;
}

如果您不想使用"."".."条目,则可能要跳过它们。

这里是working demo