#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int fd, outBak;
// const char *str1 = "write in dup2TestFile\n";
// const char *str2 = "write in tty\n";
const char *str3 = "printf in dup2TestFile\n";
const char *str4 = "printf in tty\n";
fd = open("dup2TestFile", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
if (-1 == fd)
{
printf("open dup2TestFile fail!\n");
exit(1);
}
outBak = dup(STDOUT_FILENO);
if (-1 == outBak)
{
printf("dup STDOUT_FILENO fail!\n");
exit(1);
}
if (dup2(fd, STDOUT_FILENO) != STDOUT_FILENO)
{
//printf("fd dup2 STDOUT_FILENO fail!\n");
write(outBak, "fd dup2 STDOUT_FILENO fail!\n", sizeof("fd dup2 STDOUT_FILENO fail!\n"));
exit(1);
}
printf("%s\n", str3); // 标准IO有缓冲的,文件IO则无缓冲,而stdout默认行缓冲,普通文件则全缓冲
fflush(stdout);
if (dup2(outBak, STDOUT_FILENO) != STDOUT_FILENO)
{
//printf("outBak dup2 STDOUT_FILENO fail!\n");
write(outBak, "outBak dup2 STDOUT_FILENO fail!\n", sizeof("outBak dup2 STDOUT_FILENO fail!\n"));
exit(1);
}
printf("%s\n", str4);
return 0;
}
// 记得使用perror
// 若flcose(stdout); 则(无论何时,任何重定向到该流的文件 都)无法使用stdout进行写入,example: printf("can not be write out\n");不能输出.
标准IO的重定向接口有FILE* fropen(const char* path, const char* mode, FILE* fp);
文件IO的重定向接口有dup2(int fd, int copyfd);
文件流和描述符的转换,fdopen(int fd, const char* mode); fileno(FILE* fp);