linux dup2 似乎不适用于管道?
linux dup2 doens't seem to work with pipe?
我正在 linux 上尝试 dup2。我的测试程序是:我打开一个管道,尝试将stdin复制到fifo写入,将stdout复制到fifo读取,我希望当我运行这个程序时,stdin被写入fifo,fifo自动转储内容到标准输出:
#include<stdio.h>
#include<unistd.h>
int main(){
int pipefd[2];
pipe(pipefd);
int& readfd=pipefd[0];
int& writefd=pipefd[1];
dup2(STDIN_FILENO,writefd);
dup2(STDOUT_FILENO,readfd);
char buf[1024];
scanf("%s",buf);
return 0;
}
我运行这个程序,没有看到额外的标准输出打印。我的问题:
(1) 我的标准输入 "scanf" 是否被写入 fifo writefd?
(2) 如果是,内容是否可以自动定向到我的控制台输出?如果不是怎么解决?
如果 man dup2 正确,dup2(oldfd, newfd)
系统调用会创建编号为 newfd
的 oldfd
文件描述符的副本,如果 newfd
之前是开放的。因此,您的 dup2(STDIN_FILENO,writefd)
行关闭了管道的写入端,并将其替换为标准输入的副本。下一行分别对读取端和标准输出执行相同的操作。所以你不会通过管道连接你的标准输入和标准输出。相反,您创建一个管道,然后关闭它的两端,并用原始标准输入和标准输出描述符的副本替换它们。之后,您的 scanf("%s",buf);
只是像往常一样从原始标准输入中读取一个字符串。您可以在此之后添加像 printf("%c\n", buf[1])
这样的行,它将字符串的第二个字符打印到原始标准输出。请注意,此时实际上没有使用 pipe(pipefd)
创建的管道 — 它的两端都已经关闭。
我正在 linux 上尝试 dup2。我的测试程序是:我打开一个管道,尝试将stdin复制到fifo写入,将stdout复制到fifo读取,我希望当我运行这个程序时,stdin被写入fifo,fifo自动转储内容到标准输出:
#include<stdio.h>
#include<unistd.h>
int main(){
int pipefd[2];
pipe(pipefd);
int& readfd=pipefd[0];
int& writefd=pipefd[1];
dup2(STDIN_FILENO,writefd);
dup2(STDOUT_FILENO,readfd);
char buf[1024];
scanf("%s",buf);
return 0;
}
我运行这个程序,没有看到额外的标准输出打印。我的问题:
(1) 我的标准输入 "scanf" 是否被写入 fifo writefd?
(2) 如果是,内容是否可以自动定向到我的控制台输出?如果不是怎么解决?
如果 man dup2 正确,dup2(oldfd, newfd)
系统调用会创建编号为 newfd
的 oldfd
文件描述符的副本,如果 newfd
之前是开放的。因此,您的 dup2(STDIN_FILENO,writefd)
行关闭了管道的写入端,并将其替换为标准输入的副本。下一行分别对读取端和标准输出执行相同的操作。所以你不会通过管道连接你的标准输入和标准输出。相反,您创建一个管道,然后关闭它的两端,并用原始标准输入和标准输出描述符的副本替换它们。之后,您的 scanf("%s",buf);
只是像往常一样从原始标准输入中读取一个字符串。您可以在此之后添加像 printf("%c\n", buf[1])
这样的行,它将字符串的第二个字符打印到原始标准输出。请注意,此时实际上没有使用 pipe(pipefd)
创建的管道 — 它的两端都已经关闭。