在下面的代码片段中,我将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;
}
答案 0 :(得分:1)
dup
函数复制文件描述符,也就是说,旧文件描述符和新文件描述符之后都引用相同的打开文件。这与单个文件描述符同时引用两个不同的文件不同。
如果要将相同的数据发送到两个不同的目的地,则需要在单独的进程中生成两个命令,并自行复制,或者生成“tee”命令的副本 - 无论哪种方式,最终都会有三个过程。
答案 1 :(得分:1)
这对我有用:
#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;
}
答案 2 :(得分:0)
尝试检查您执行的所有系统调用的结果代码(包括dup2)。这可能会引导您回答。无论如何,这是一个很好的习惯。