重定向execl函数的结果
Redirect the result of execl function
节目:
#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
$
在上面的程序中,parent创建了一个child,child执行ls命令。但是,我的要求是将 ls 的输出保存在父级的数组中。有什么办法可以做到这一点。
exec*()
系列函数将当前进程的 image 替换为新进程。所以不能直接读。您不需要子进程来读取外部命令的输出。您可以使用 popen()
来实现。
如果您必须创建一个子进程,那么您可以使用pipe(2)
从子进程的输出中读取。您可以在链接的手册页上找到一个简单示例。
使用 popen()
是一种可能性,但如果您想使用 fork()/exec*()
,您可以这样做:
在 fork()
之前,创建一个管道并将其附加到子
中的标准输出
int fds[2];
pipe(fds);
fork后,在子进程中关闭读fd并将写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));
如果需要缓冲,可以在父进程的read-fd上调用fdopen()
。
节目:
#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
$
在上面的程序中,parent创建了一个child,child执行ls命令。但是,我的要求是将 ls 的输出保存在父级的数组中。有什么办法可以做到这一点。
exec*()
系列函数将当前进程的 image 替换为新进程。所以不能直接读。您不需要子进程来读取外部命令的输出。您可以使用 popen()
来实现。
如果您必须创建一个子进程,那么您可以使用pipe(2)
从子进程的输出中读取。您可以在链接的手册页上找到一个简单示例。
使用 popen()
是一种可能性,但如果您想使用 fork()/exec*()
,您可以这样做:
在 fork()
之前,创建一个管道并将其附加到子
int fds[2];
pipe(fds);
fork后,在子进程中关闭读fd并将写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));
如果需要缓冲,可以在父进程的read-fd上调用fdopen()
。