2

我刚开始学习 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"

4

3 回答 3

1

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

execl("/bin/sh","/bin/sh","-c","ls -l | cut -c28", (char*) 0);
于 2012-09-21T15:32:41.293 回答
1

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

在您的情况下,execl线路失败。

于 2012-09-21T15:33:52.417 回答
0

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

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

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

于 2012-09-21T15:38:44.220 回答