APUE习题3.2以及shell中重定向符号的使用
#include <stdio.h>
#include <stdlib.h>
#define OPEN_MAX 63
int 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++){ //由于dup2总返回当前可用文件描述符的最小值,因此要不断尝试
fd_rec[n] = fd; //保存尝试的文件描述符,以便后面关闭
}
if( fd != filedes2) //退出循环的条件也可能由于filedes2已被占用,这时dup2的行为是先将其关闭
{
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中没有任何记录。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。