APUE习题3.2用dup实现dup2以及shell中重定向符号的使用
#include <stdio.h>
#include <stdlib.h>
#define OPEN_MAX 63int my_dup2(int filedes,int filedes2);
int
main(int argc, char* argv[])
{
int fd,fd2;
char buf[] = "It work!\n";if(argc != 3)
err_quit("Usage: %s <filedes#> <filedes2#>",argv[0]);
fd = atoi(argv[1]);
fd2 = atoi(argv[2]);
my_dup2(fd, fd2);
printf("fd#%d -> fd#%d\n", fd2, fd);
if( write(fd2, buf, 9) != 9)
err_sys("write error");exit(0);
}int
my_dup2(int filedes,int filedes2)
{
int fd_rec[OPEN_MAX];
int fd,i,n;
if( filedes == filedes2) //模拟dup2的行为,当filedes2等于filedes时,直接返回filedes即可
return filedes;for(n=0 ; (fd=dup(filedes)) < filedes2; n++){ //由于dup总返回当前可用文件描述符的最小值,因此要不断尝试
fd_rec[n] = fd; //保存尝试的文件描述符,以便后面关闭
}
if( fd != filedes2) //退出循环的条件也可能由于filedes2已被占用,这时dup2先将原先占有filedes2的文件关掉,此时dup肯定是filedes2
{
close(filedes2);
fd = dup(filedes);
}
//关闭打开的非目标文件描述符
for(i=0; i<n; i++)
close(fd_rec[i]);
return fd;
}
- 在没有这些重定向符号时,shell会在运行命令程序前的准备阶段,初始化fd#0、fd#1、fd#3的指向。
- 使用重定向符时,指定文件描述符上打开文件的工作也是在shell运行命令程序前准备阶段完成的。
对于my_dup2的测试,
$ my_dup2 2 17
将在屏幕上输出"It works!";
$ my_dup2 7 17 7<>/dev/fd/1
也将输出"It works!";
$ my_dup2 2 17 17>tmp.foo
屏幕输出"It words!",但tmp.foo中没有任何记录,这个例子模拟17已被占有的情形。
APUE习题3.2用dup实现dup2以及shell中重定向符号的使用的更多相关文章
- dup和dup2应用实例(dup跟APUE有出入,close+dup=dup2?)
dup/dup2函数 有时我们希望把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接. dup()与dup2()能对输入文件描述符进行重定向. 函数原型如下: dup函数创建一个新的文件描 ...
- linux之dup和dup2函数解析
1. 文件描述符在内核中数据结构在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个 ...
- Linux进程间通信(三):匿名管道 popen()、pclose()、pipe()、close()、dup()、dup2()
在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据. 一.什 ...
- dup和dup2用法小结
今天和同学探讨了一下关于重定向输出到文件的问题,其中需要用到dup和dup2函数,因此来小小的总结一下. 首先来man一下: dup直接返回一个新的描述符和原来的描述符一样代表同一个资源,描述符的值就 ...
- Linux内核分析:dup、dup2的实现
一.首先需要看一下这两个函数的作用: #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); 根据m ...
- dup和dup2函数
下面两个函数都可用来复制一个现存的文件描述符: #include<unistd.h> int dup(int filedes); int dup2(int filedes,int file ...
- dup和dup2函数以及管道的实现
疑问:管道应该不是这样实现的,因为这要求修改程序的代码 dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符.它们经常用来重定向进程的stdin.stdout和stderr. ...
- dup和dup2详解
C语言中dup和dup2函数的不同和使用 发表时间: 2012年11月15日 | 作者: 陈杰斌 | 所属分类: C语言 | 评论: 0 | 浏览: 1024 在unix高级编程中有介绍dup和dup ...
- Linux系统编程--文件描述符的复制dup()和dup2()【转】
本文转载自:http://blog.csdn.net/tennysonsky/article/details/45870459 dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个 ...
随机推荐
- python 数据可视化(matplotlib)
matpotlib 官网 :https://matplotlib.org/index.html matplotlib 可视化示例:https://matplotlib.org/gallery/inde ...
- leveldb 学习记录(一) skiplist
leveldb LevelDb是一个持久化存储的KV系统,并非完全将数据放置于内存中,部分数据也会存储到磁盘上. 想了解这个由谷歌大神编写的经典项目. 可以从数据结构以及数据结构的处理下手,也可以从示 ...
- 20170805_linux
http://blog.csdn.net/aaaaatiger/archive/2007/07/28/1713611.aspx Delphi/Pascal code ? 1 2 3 4 5 6 7 ...
- 统计百分比的一个SQL脚本
统计一个表中一个百分比的SQL脚本,不过这个是个万分比,这个数据类型要调一调 ),) declare @num3 decimal,@num4 decimal declare @percent deci ...
- sleep() 和 wait() 区别
sleep()不释放同步锁,wait()释放同步锁 sleep()的作用是让线程休眠指定的时间,时间到后自动恢复线程执行.运行的主动权是由线程决定的. wait()可以用notify()直接唤起,运行 ...
- linux 系统管理学习
Linux系统管理一.进程管理1.进程管理的作用1)判断服务器健康状态2)查看系统中所有进程3)杀死进程2.进程的查看1)查看所有进程ps aux 查看系统中所有进程ps -le 查看系统中所有进程- ...
- python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
os._exit() 和 sys.exit() os._exit() vs sys.exit() 概述 Python的程序有两中退出方式:os._exit(), sys.exit().本文介绍这两种方 ...
- zabbix items
zabbixversion:3.2.8 在添加zabbix items的时候,注意store value的设置非常实用,有三种选择: As is:d对接受到的结果不做任何处理 Delta(speed ...
- python_day1_数据类型
数据类型: python基本数据类型有:int(整型),str(字符串),list[](列表),dict{}(字典),li()(元祖)bool(布尔) 注:还有一个Long(长整型),python3里 ...
- 【pycharm 警告】unittest RuntimeWarning: Parent module ” not found while handling absolute import
Pycharm 2016.2执行单元测试遇到如下问题: RuntimeWarning: Parent module ‘YOUR_MODULE_HERE’ not found while handlin ...