Linux编程 ---- dup函数

dup,dup2,dup3函数

      顾名思义,dup及duplicate的简写,也就是复制的意思。而事实上这几个函数的功能也确实是复制文件描述符。那为什么要复制文件描述符呢?呵呵,我认为是程序员想偷懒,因为这个功能可以进行输入输出重定向。

下面这个程序将实现文件复制功能

 1 #include<stdio.h>
 2 #include<sys/types.h>
 3 #include<fcntl.h>
 4 #include<stdlib.h>
 5 #include<sys/stat.h>
 6 #include<unistd.h>
 7 #include<errno.h>
 8 #include<string.h>
 9
10 void err_exit(const char *msg)
11 {
12     fprintf(stderr,"%s\n",msg);
13     exit(1);
14 }
15
16 int main(int argc, const char *argv[])
17 {
18     if(argc != 3)
19         err_exit("Argument Error!");
20     int fdr = open(argv[1],O_RDONLY);
21     if(fdr == -1)
22         err_exit(strerror(errno));
23     int fdw = open(argv[2],O_CREAT | O_EXCL | O_RDONLY | O_RDWR,0666);
24     if(fdw == -1)
25         err_exit(strerror(errno));
26     int fd_out = dup(STDOUT_FILENO);//保存标准输出文件描述符
27     int fd_in = dup(STDIN_FILENO);
28
29     dup2(fdw,STDOUT_FILENO);
30     dup2(fdr,STDIN_FILENO);
31
32     int data;
33     while((data = getc(stdin)) != EOF)
34     {
35         putc(data,stdout);
36     }
37
38        //printf("Hello Hjj\n");//这句将写入文件中
39     fflush(stdout);
40     close(fdr);
41     close(fdw);
42     dup2(fd_out,STDOUT_FILENO);//恢复标准输出
43     dup2(fd_in,STDIN_FILENO);
44     printf("Hello Hjj\n");
45     return 0;
46 }

Linux编程 ---- dup函数

时间: 2024-11-04 21:11:52

Linux编程 ---- dup函数的相关文章

Linux - 编程常用函数

listen()函数 功能 用于面向连接服务器,表明愿意接收连接 #include <sys/socket.h> 函数原型 int listen(int s, int backlog); 参数说明 sockfd:调用socket返回的文件描述符 backlog:accept()应答之前,允许在进入队列中等待的连接数目,出错时返回-1 返回值 成功时,返回0 失败时,返回-1 说明 在使用listen()之前,需要调用bind()绑定到需要的端口,否则系统内核将会监听一个随机端口 accept(

[Linux编程] module_param()函数学习笔记

在读TCP cubic源码中,遇到了module_param(),网上查到的资料如下: 在用户态下编程可以通过main()来传递命令行参数,而编写一个内核模块则可通过module_param()来传递命令行参数. 它的具体实现方式为:module_param_named( name, type, perm),具体为变量名,它的类型,以及一个权限掩码用来做一个辅助的sysfs入口. 给出一个cubic的例子: module_param(fast_convergence, int, 0644);

linux编程|fork函数讲解

[[email protected] bdkyr]# cat fork_test.c /* *  create by bdkyr *  date 2015-1-22 */ #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <unistd.h> #include <stdarg.h> #include <string.h> #define MAXLINE

linux编程中接收主函数返回值以及错误码提示

程序A创建子进程,并调用进程B,根据不调用的不同情况,最后显示结果不同. #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <errno.h> int main() { pid_t pid, rpid; int stat; if ((pid = fork()) < 0) { perror("for

linux socket网络编程 常用函数及头文件

转自:http://blog.chinaunix.net/u3/102500/showart_2065640.html 一 三种类型的套接字: 1.流式套接字(SOCKET_STREAM) 提供面向连接的可靠的数据传输服务.数据被看作是字节流,无长度限制.例如FTP协议就采用这种. 2.数据报式套接字(SOCKET_DGRAM) 提供无连接的数据传输服务,不保证可靠性. 3.原始式套接字(SOCKET_RAW) 该接口允许对较低层次协议,如IP,ICMP直接访问. 二 基本套接字系统调有有如下一

linux编程下signal()函数

linux编程下signal()函数 当服务器close一个连接时,若client端接着发数据.根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了.根据信号的默认处理规则SIGPIPE信号的默认执行动作是 terminate(终止.退出), 所以client会退出. 若不想客户端退出可以把 SIGPIPE设为SIG_IGN 如: signal(SIGPIPE,SIG_IGN); 这时SI

Linux编程定时执行某函数

 前言: linux中信号提供了软中断的作用.提供了一种处理异步时间的方法 ,  可以通过信号合理的安排异步任务. linux定义了以下主要的系统信号: 名称                        默认动作                        说明 SIGHUP                   终止进程                        终端线路挂断 SIGINT                   终止进程                        中

Unix 网络编程 dup和dup2函数

dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符.它们经常用来重定向进程的stdin.stdout和stderr.这两个函数的原形如下: #include <unistd.h> int dup( int oldfd ); int dup2( int oldfd, int targetfd ); dup()函数: 利用函数dup,我们可以复制一个描述符.传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝.这意味着,这两个描述符

linux 网络编程常用函数及流程

一.网络编程之TCP流程 服务端:socket---bind---listen---while(1){---accept---recv---send---close---}---close 客户端:socket----------------------------------connect---send---recv-----------------close 二.网络编程常用函数 服务器端: 头文件包含: #include<sys/types.h> #include<sys/sock