- 论坛徽章:
- 0
|
一个人在CU上面问:
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include sys/types.h>
#include sys/stat.h>
#include "fcntl.h"
#define STDOUT 1
int main(){
int oldpd;
oldpd=open("a.log",(O_RDWR | O_CREAT),0644);
dup2(oldpd,STDOUT);
printf("A simple Test String\n");
//这里加代码使得下面的语句再输出到标准输出上,而不是a.log里
printf("hello world\n");
return 0;
}
如上所述,第一次输出的“A simple Test String”将被输出到a.log里,但我希望之后的"hello world"再输出到标准输出上,应该怎么做?
谢谢!
----------------
http://linux.chinaunix.net/bbs/viewthread.php?tid=1128130&pid=7084423&page=1&extra=page%3D1
我的答案是:
int oldfd;
int newfd;
char *tty_name=ttyname(STDOUT_FILENO);
printf("ttyname:%s\n",tty_name);
oldfd=open("a.log",(O_RDWR | O_CREAT),0644);
newfd=dup2(oldfd,STDOUT_FILENO);
printf("A simple Test String: %d\n",newfd);
close(STDOUT_FILENO);
open(tty_name,O_RDWR);
printf("hello world\n");
return 0;
输出是:
$ ./hole.o
ttyname:/dev/pts/0
hello world
文件内容是:
$ cat a.log
A simple Test String: 1
----
int dup2(fd_old,fd_new);
的作用是:
如果在新的文件描述符fd_new上复制原来的文件描述符fd_old
然后fd_old,fd_new指向共同的文件表项。如果原来fd_new是打开的,那么我们就关闭原来的fd_new,然后用fd_new指向fd_old指向的文件表项。
所以在这个应用中调用
dup2(oldfd,STDOUT_FILENO);后
STDOUT_FILENO就已经被关闭,然后再在STDOUT_FILENO上打开了fd_old指向的文件表项。
这是我们如果想恢复STDOUT_FILENO,只能再次打开了。而这是我们只能根据文件名字来打开了。所以我们用ttyname(STDOUT_FILENO);先得到并保存了stdout的文件名字。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/101728/showart_2020098.html |
|