dup2替换
今天看APUE上一道题,要求不能用fcnt1来替换dup1.
刚开始的思路是dup一个,测试发现与期望的不一致就马上关闭,发现遇到无限循环,刚才想了下,才发现一旦close掉,再次dup仍然是分配最小的fd,所以永远也得不到最终的结果。囧!
好吧,依据网友的,自己整理了下:
#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <error.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h> #define err_sys(info) \
{ \
fprintf(stderr, "%s.\n", info); \
exit(EXIT_FAILURE); \
}
#define MaxFD 1024 int test_dup(int fd1,int fd2){
/* dup2(fd1,fd2) */
int fd=0;
int array_fd[MaxFD];
int i=0; printf(" dup2(%d,%d) \n", fd1, fd2);
if((fd1 < 0) || (fd2 < 0) || fd2 > MaxFD)
{
err_sys(" Please check file_id. ");
}
fd = dup(fd1);
if(fd < 0)
{
err_sys(" the file id has no corresponding file ");
} while(fd < fd2 && i++ < MaxFD)
{
//close(array_fd[i-1]); 千万不能在这里关闭
array_fd[i]=fd;
fd = dup(fd1);
if (fd < 0)
{
err_sys(" can't open it ");
} printf("fd = %d \n", fd);
}
if(fd > fd2)
{
close(fd2);
fd = dup(fd1);
}
for(;i>=0;i--)
{
close(array_fd[i]);
} return fd;
}
int main(int argc, char* argv[])
{
test_dup(1,100);
exit(0);
}
dup2替换的更多相关文章
- UNIX环境高级编程APUE练习3.2-不用fcntl实现dup2的功能
1 题面 编写与dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理. 2 基本思路 不能用fcntl,能够返回一个文件描述符的只有open和dup.而open会创建一个新的文件表 ...
- dup和dup2函数以及管道的实现
疑问:管道应该不是这样实现的,因为这要求修改程序的代码 dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符.它们经常用来重定向进程的stdin.stdout和stderr. ...
- Linux Shell编程(28)——进程替换
进程替换与命令替换很相似. 命令替换把一个命令的结果赋给一个变量,例如 dir_contents=`ls -al`或xref=$. 进程替换则是把一个进程的输出回馈给另一个进程 (换句话说,它把一个命 ...
- dup,dup2函数【转】
转自:http://eriol.iteye.com/blog/1180624 转自:http://www.cnblogs.com/jht/archive/2006/04/04/366086.html ...
- UNIX 系统调用:dup,dup2实现重定向
重定向一般在命令行里就是把原本输出到屏幕的数据转而输出到一个指定的文件当中.如 $ pwd > workdir.txt 此时workdir.txt内就存储了pwd命令的输出,当前所在的工作目录 ...
- Unix 网络编程 dup和dup2函数
dup和dup2也是两个很实用的调用,它们的作用都是用来复制一个文件的描写叙述符. 它们经经常使用来重定向进程的stdin.stdout和stderr.这两个函数的原形例如以下: #include & ...
- Shell替换
如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...
- [APUE]不用fcntl实现dup2函数功能
dup2的函数定义为: #include <unistd.h> int dup2(int src_fd, int new_fd); 自己实现dup2函数有几个关键点: 1,检查给定的源fd ...
- ContentProvider域名替换小工具
开发项目域名想怎么换就怎么换,就是这么任性! 这是一个很有意思的小工具! 这是一个方便开发人员和测试人员的小工具!! 吐槽: 一直在做Android开发,一直总有一个问题存在:做自己公司的apk开发时 ...
随机推荐
- 将SublimeText 添加到鼠标右键的方法
- 学习C程序设计(一)第一节总览
1.程序设计面向的问题 一切可计算问题都可以用程序的方法解决.ps:这样程序与计算有关了 1.1程序设计的五个步骤: a.确定问题可以计算:(问题是可计算) b.建立问题的数学模型:(不懂) c.设计 ...
- JavaScript中为什么string可以拥有方法?
所有文章搬运自我的个人主页:sheilasun.me 引子 我们都知道,JavaScript数据类型分两大类,基本类型(或者称原始类型)和引用类型. 基本类型的值是保存在栈内存中的简单数据段,它们是按 ...
- 小米note开启调试模式
1.刷机为开发版本. 2.拨电话界面输入 *#*#717717#*#* 开启调试模式. 3.驱动好像会自己安装.
- Codeforces 251C Number Transformation
Number Transformation 我们能发现这个东西是以2 - k的lcm作为一个循环节, 然后bfs就好啦. #include<bits/stdc++.h> #define L ...
- Python reverse
一.reverse. 将列表中的元素反转. a = [1,2,3] a.reverse. [3,2,1]
- 10.Django用户认证组件
用户认证组件: 功能:用session记录登录验证状态: 前提:用户表,django自带的auth_user 创建超级用户:python manage.py createsuperuser ...
- poj 3009 冰球 【DFS】求最小步数
题目链接:https://vjudge.net/problem/POJ-3009 转载于:https://www.cnblogs.com/Ash-ly/p/5728439.html 题目大意: 要求把 ...
- canvas三角函数模拟水波效果
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- 连接池commons-pool2
commons-pool2池技术可以应用在对象上构建对象池,也可以用在http连接或者netty连接 构建连接池,池技术为了节省对象创建销毁或连接资源频繁申请销毁带来的时间消费. 当用于连接池在进行扩 ...