2

程序:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
        int cpid=fork();
        if(cpid==0){
                execl("/bin/ls","ls","-lah","--color",NULL);
        }
        else{
                int status;
                waitpid(cpid,&status,0);
                if(status!=0)
                        printf("Error Occured\n");
        }
return 0;
}

输出:

$ ./a.out 
total 20K
drwxrwxr-x 1 guest guest 4.0K Jan 12 15:21 .
drwxrwxr-x 1 guest guest 4.0K Jan 12 15:21 ..
-rwxrwxr-x 1 guest guest 7.2K Jan 12 15:19 a.out
-rw-rw-r-- 1 guest guest  372 Jan 12 15:20 execl.c
$ 

在上面的程序中,父母创建一个孩子,孩子执行 ls 命令。但是,我的要求是将 ls 的输出保存在父数组中。有没有办法做到这一点。

4

2 回答 2

3

exec*()族函数用新的图像替换当前进程的图像。所以不能直接读。您不需要子进程来读取外部命令的输出。您可以使用popen()来实现这一点。

如果您确实必须创建一个子进程,那么您可以使用pipe(2)从子进程的输出中读取。您可以在链接的手册页上找到一个简单的示例。

于 2016-01-12T10:00:16.617 回答
1

使用popen()是一种可能性,但如果你想使用fork()/exec*(),你可以这样做:

在 之前fork(),创建一个管道并将其附加到子级的 stdout

int fds[2];
pipe(fds);

在 fork 之后,在子进程中关闭 read fd 并将 write fd 附加到 stdout:

close(fds[0]);
dup2(fds[1], 1);
close(fds[1]);

在父进程中,关闭 write fd 并从 read-fd 中读取,得到输出:

close(fds[1]);
read(fds[0], buf, sizeof(buf));

如果需要缓冲,可以fdopen()在父进程中调用 read-fd。

于 2016-01-12T10:24:06.160 回答