使用C读取exec()创建的子管道

使用C读取exec()创建的子管道,c,exec,fork,pipe,C,Exec,Fork,Pipe,我刚刚开始学习C编程,我对fork(),exec(),pipe()等有一些不确定性 我已经开发了这个代码,但是当我执行它时,变量c仍然是空的,所以我不知道孩子是不是在向管道中写入数据,或者家长是不是在从中读取数据 你能帮我吗?代码如下: int main() { int pid=0; int pipefd[2]; char* c=(char *)malloc(sizeof(char)); FILE *fp; pipe(pipefd); pid=fork(); if (pid==0){

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

我已经开发了这个代码,但是当我执行它时,变量
c
仍然是空的,所以我不知道孩子是不是在向管道中写入数据,或者家长是不是在从中读取数据

你能帮我吗?代码如下:

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(存储在char c.txt中的数字)”
execl
执行单个命令,并且不知道诸如管道之类的shell概念。如果要执行shell命令,必须执行shell,如下所示:

execl("/bin/sh","/bin/sh","-c","ls -l | cut -c28", (char*) 0);
始终检查系统调用(如和派生函数如)的返回值,并使用来找出哪里出了问题


在您的例子中,
execl
行失败。

使用strcpy/strcat似乎有点过于复杂。snprintf可以将这三行转换为一行

snprintf( root, size_of_buf, "/home/random%s", c );

此外,请检查您的错误代码。如前所述,execl正在失败,而您对此一无所知。fork,dup2,…,也可能失败,您希望尽早知道

检查您的
execl
调用是否没有返回-我认为您不能这样调用
execl
。可能值得一提的是空的
argv[0]
-我认为这也不允许。他确实传递了一个
argv[0]
,与程序名相同。