假如你在编写中(网络编程) 不想向fd write 写太多次,可以得用dup dup2
把stdout stderr 指向你要write的fd , 这样你可以用printf print cout cerr 等就是对fd 回包了
整完记得恢复回来哦。
/*int save_fd_stdout,save_fd_stderr;
save_fd_stdout=dup(STDOUT_FILENO);
save_fd_stderr=dup(STDERR_FILENO);
dup2(fd,STDOUT_FILENO);
dup2(fd,STDERR_FILENO);
cout cerr ………
dup2(save_fd_stdout,STDOUT_FILENO);
dup2(save_fd_stderr,STDERR_FILENO);
close(fd);
close(save_fd_stdout);
close(save_fd_stderr);
*/
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
int fd ,save_fd;
char msg[]="this is a teest file \n";
//open somefile
fd=open("somefile",O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);
if (fd<0) {
perror("open");
exit(1);
}
//cp stdout fd,产生新的fd 值 ,也指向了tty
/*
save_fd ----> tty
STDUOUT_FILENO{1}---->tty
*/
save_fd=dup(STDOUT_FILENO);
/*fd --->STDOUT_FILENO --->open "somefile"
fd--->somefile struct {f_count}
STDUOUT_FILENO--->somefile
somefile struct {f_count=2}
*/
dup2(fd,STDOUT_FILENO);
close(fd);//somefile struct {f_count=1} 指数-1
write(STDOUT_FILENO,msg,strlen(msg)); //写向somefile
dup2(save_fd,STDOUT_FILENO); //恢复stdout fd
/*
save_fd=1 ,现令STDOUT_FILENO=1
*/
write(STDOUT_FILENO,msg,strlen(msg));
close(save_fd);
return 0;
}