我正在编写一个C程序,其中fork()
,exec()
和wait()
。我想把我执行的程序的输出写入文件或缓冲区。
例如,如果我执行ls
,我想将file1 file2 etc
写入缓冲区/文件。我认为没有办法读取标准输出,所以这是否意味着我必须使用管道?这里有一个我无法找到的一般程序吗?
答案 0 :(得分:79)
用于将输出发送到另一个文件(我要忽略错误检查以关注重要细节):
if (fork() == 0)
{
// child
int fd = open(file, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
dup2(fd, 1); // make stdout go to file
dup2(fd, 2); // make stderr go to file - you may choose to not do this
// or perhaps send stderr to another file
close(fd); // fd no longer needed - the dup'ed handles are sufficient
exec(...);
}
将输出发送到管道,然后您可以将输出读入缓冲区:
int pipefd[2];
pipe(pipefd);
if (fork() == 0)
{
close(pipefd[0]); // close reading end in the child
dup2(pipefd[1], 1); // send stdout to the pipe
dup2(pipefd[1], 2); // send stderr to the pipe
close(pipefd[1]); // this descriptor is no longer needed
exec(...);
}
else
{
// parent
char buffer[1024];
close(pipefd[1]); // close the write end of the pipe in the parent
while (read(pipefd[0], buffer, sizeof(buffer)) != 0)
{
}
}
答案 1 :(得分:14)
您需要确切地确定您想要做什么 - 并且最好更清楚地解释一下。
如果您知道要执行的命令的输出要转到哪个文件,则:
如果您希望父级读取子级的输出,请安排子级将其输出传回给父级。
答案 2 :(得分:2)
由于您似乎要在linux / cygwin环境中使用它,因此您希望使用popen。这就像打开一个文件一样,只有你才能获得正在执行的程序stdout
,这样你就可以使用正常的fscanf
,fread
等。
答案 3 :(得分:1)
分叉后,使用dup2(2)
将文件的FD复制到stdout的FD中,然后执行。
答案 4 :(得分:1)
您还可以使用linux sh
命令,并将包含重定向的命令传递给它:
string cmd = "/bin/ls > " + filepath;
execl("/bin/sh", "sh", "-c", cmd.c_str(), 0);