在下面的代码片段中,我将ls
命令的输出重定向到wc -l
的输入,该输入工作正常。现在我还想使用以下代码将ls
命令的输出重定向到名为"beejoutput.txt"的文件,但它不起作用。需要帮助。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int pfds[2];
pipe(pfds);
if (!fork())
{
dup2(pfds[1],1);
close(pfds[0]);
execlp("ls", "ls",NULL);
}
else
{
FILE *outputO=fopen ("beejoutput.txt", "w"); //opening file for writing
dup2(pfds[0],0);
dup2(fileno(outputO),pfds[0]);
close(pfds[1]);
execlp("wc", "wc","-l", NULL);
}
return 0;
}
dup
函数复制文件描述符,也就是说,旧文件描述符和新文件描述符之后都引用同一个打开的文件。这与让单个文件描述符同时引用两个不同的文件不同。
如果要将相同的数据发送到两个不同的目的地,则需要在单独的进程中生成这两个命令,然后自己进行复制,或者生成"tee"命令的副本 - 无论哪种方式,您最终都会得到三个进程。
这对
我有用:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(void)
{
int pfds[2];
pipe(pfds);
pid_t childpid = fork();
if (childpid == 0) {
/* Child */
dup2(pfds[1],1);
close(pfds[0]);
execlp("ls", "ls",NULL);
} else {
/* Parent */
pid_t retpid;
int child_stat;
while ((retpid = waitpid(childpid, &child_stat, 0)) != childpid && retpid != (pid_t) -1)
;
close(pfds[1]);
char buf[100];
ssize_t bytesread;
int fd = open("beejoutput.txt", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (fd == -1) {
fprintf(stderr, "Opening of beejoutput.txt failed!n");
exit(1);
}
/* This part writes to beejoutput.txt */
while ((bytesread = read(pfds[0], buf, 100)) > 0) {
write(fd, buf, bytesread);
}
lseek(fd, (off_t) 0, SEEK_SET);
dup2(fd, 0);
execlp("wc", "wc", "-l", NULL);
}
return 0;
}
尝试检查您执行的所有系统调用(包括 dup2)的结果代码。这可能会引导您找到答案。无论如何,这是一只好兔子。