zt dup() 和 dup2()
#include <unistd.h>
int dup(int newfd);
int dup2(int newfd, int oldfd);
下面用一个简单的例子解释两个函数的用法和区别:
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int fd, save_fd;
char msg[] = "This is a test of dup() & dup2()\n";
int test;
fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
if(fd<0) {
perror("open");
exit(1);
}
save_fd = dup(STDOUT_FILENO); //运行后save_fd指向STDOUT——FILENO,即save_fd指向标准输出
printf("save_fd=%d\n",save_fd); //测试用
test=dup2(fd, STDOUT_FILENO); //运行后STDOUT_FILENO指向fd所指向的文件,即STDOUT_FILENO指向somefile
printf("dup2_1=%d\n",test); //测试用 此时的标准输出不再指向显示器,因此该段测试将写入somefile文件中
close(fd);
write(STDOUT_FILENO, msg, strlen(msg)); //此时STDOUT_FILENO所指向的是somefile文件不再是标准输出流,因此该段将
//写入somefile文件中
test=dup2(save_fd, STDOUT_FILENO); //运行后STDOUT_FILENO指向save_fd所指向的文件,即标准输出流
printf("dup2_2=%d\n",test); //测试用 此时标准输出流重新指回显示器,因此该段测试将写入显示器
write(STDOUT_FILENO, msg, strlen(msg)); //此时STDOUT_FILENO所指向的便回标准输出流该段将写入显示器
close(save_fd);
return 0;
}
该程序运行后显示器上显示的内容为:
[crosslandy@localhost PIPE]$ ./dup_example
save_fd=4
dup2_2=1
This is a test
somefile文件内的内容为:
dup2_1=1
This is a test
注:本例子转自他人
最新文章
- 开发者最爱的Firebug停止更新和维护
- 动手实践 Linux VLAN - 每天5分钟玩转 OpenStack(13)
- UDP的使用
- leetcode 74. Search a 2D Matrix
- oracle with as 用法
- 拓扑编号 vijos1790
- matlab中meshgrid函数的用法
- web.xml配置文件 taglib
- Spring: DispacherServlet和ContextLoaderListener中的WebApplicationContext的关系
- 深入理解ob_flush和flush的区别(转)
- 打造自己个性的notepad ++
- socket 通信之select
- css3: css3选择器
- leetcode — valid-palindrome
- dubbo远程方法调用的基本原理
- SQL 加载
- VS2012 安装番茄插件
- 基于Kafka消息驱动最终一致事务(一)
- (转阮一峰)深入理解OAuth 2.0
- SparkR(R on Spark)编程指南 含 dataframe操作