c - 读取由 exec() 用 C 创建的子管道

标签 c exec fork pipe

我刚刚开始学习 C 编程,对 fork()exec()pipe() 有一些不确定性等

我已经开发了这段代码,但是当我执行它时,变量c仍然为空,所以我不知道 child 是否没有写入管道,或者父项是否写入不从中读取。

你能帮我一下吗?这是代码:

int main() {
int pid=0;
int pipefd[2];
char* c=(char *)malloc(sizeof(char));   
FILE *fp;

pipe(pipefd);

pid=fork();

if (pid==0){
    close(pipefd[0]);
    dup2(pipefd[1],1);
    close(pipefd[1]);
    execl("ls -l | cut -c28","ls -l | cut -c28", (char *) 0);
}
else{

    close(pipefd[1]);
    read(pipefd[0], c, 1);
    char* path="/home/random";
    char* txt=".txt";
    char* root=malloc(strlen(path) + strlen(txt) + sizeof(char));
    strcpy(root,path);
    strcat(root,c);
    strcat(root,txt);
    close(pipefd[0]);

    fp=fopen(root,"w+");
    (...)
}

问题是最终的根字符串只有 "/home/random.txt" 因为 char c 中没有任何内容,而我想要的是打开文件“/home/random(存储在字符c中的数字).txt”

最佳答案

execl 执行单个命令,并且不了解诸如管道之类的 shell 概念。如果要执行shell命令,则必须执行shell,如下所示:

execl("/bin/sh","/bin/sh","-c","ls -l | cut -c28", (char*) 0);

关于c - 读取由 exec() 用 C 创建的子管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12533443/

相关文章:

java - 从 Java 执行命令时出现问题

go - Go 中的持久化程序

c - Fork 和 NodeJS 错误

通过 execv() 调用 echo 打印额外字符

c++ - malloc 的内存与 std::make_shared 创建的对象重叠

c - 获取系统调用ID并将其存储在.txt文件中(LINUX)

msbuild - 在不使用Exec或ItemGroup的情况下在MSBuild中复制单个文件

c - 如何 fork 多个 child 同时计算动态过程的多个时间步长

c - 如何在网络中广播消息?

c - 预测 C 中的 malloc block 大小网格