c - 如何将 system() 中命令的标准输出传递给自身标准输入?

标签 c linux

假设我这样调用:

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

...我如何在调用进程标准输入中捕获它?

根据我的阅读,系统(在 Linux 中)打开 bash 提示符并尝试执行命令。这表明进程调用系统是父进程。 Reading about parent process pid suggest this is always 1111 ,但我找不到这方面的确切来源,只是 linux haxers 说“这样做”,既没有解释也没有来源。

阅读一些其他来源可以通过 /proc/pid/fd/0 将数据传递到任意进程管道

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

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

...完成这个。但看起来我以前什么都没做过,我的推论来源也不像我希望的那样正式。

那么,这是一种将系统命令的输出传递给自身标准输入的可移植方式吗?

如果没有,我该怎么做?

最佳答案

您似乎正在尝试读取特定目录中所有文件/文件夹名称的列表。在您的情况下是当前工作目录。由于您尝试使用 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同样的

关于c - 如何将 system() 中命令的标准输出传递给自身标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51040104/

相关文章:

c - 做 while 和右移没有效果

c++ - 分配内存和保留内存有什么区别?

c - 在单个链表中的任何索引处插入新节点

c - mod C 的问题

linux - 我的程序在读取/etc/passwd时应该锁定/etc/.pwd.lock吗?

linux - 查找具有超过特定文件大小的特定扩展名的文件

c - Linux;如果您不是 root,请将 UID 更改为 root

c - 下面程序的输出应该是什么?

linux - Scrapy:ModuleNotFoundError:没有名为 'scrapoxy' 的模块

c - 如何使用 microhttpd.h 在 C 中读取包含问号的 URL