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

时间:2012-09-21 15:21:23

标签: 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){
    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(number stored in char c).txt"

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

始终 检查系统调用的返回值(如execve(2)和派生函数,如execl(3)),并使用{{3找出问题所在。

在您的情况下,execl行失败。

答案 2 :(得分:0)

使用strcpy / strcat似乎有点过于复杂。 snprintf可以将这3行变成一行。

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

此外,请检查您的错误代码。如上所述,execl失败了,你不知道。 fork,dup2,...,也可能失败,你想早点而不是早点知道。