猜想
2>&1
这种重定向是通过打开1号文件描述符对应的目标文件, 设定打开文件返回的文件描述符为fd, 然后调用类似dup2(fd,2)的函数, 将fd号文件描述符复制到2号文件描述符中, fd和2指向的同一份文件表项, 但2和1指向的就不是同一份文件表项2>&1
这种重定向是直接通过调用类似dup2(1,2)的函数, 将1号文件描述符复制到2号文件描述符中, 1和2指向的同一份文件表项
实验设计
设计来源: 因为两种猜想的矛盾点在于2和1指向的是不是同一份文件表项, 可以根据文件表象中的当前文件偏移量来设计实验
实验方法: 如果两个文件描述符指向的是同一份文件表项, 那么偏移某一个文件描述符指向的文件表项中的当前文件偏移量, 另外一个文件描述符指向的文件表项中的当前文件偏移量也会改变; 反之, 如果两个文件描述符指向的不是同一份文件表项, 偏移其中一个文件描述符指向的文件表项中的当前文件偏移量就不会影响另外一个文件描述符指向的另外一份文件表项中的当前文件偏移量
实验过程
测试代码:
int main(){
//偏移0号文件描述符2个字节
if(lseek(0,2,SEEK_CUR) == -1){
fprintf(stdout,"lseek() failed.\n");
}
//查看0号文件描述符的当前文件偏移量
fprintf(stdout,"offset of 0 is %d\n",lseek(0,0,SEEK_CUR));
//查看2号文件描述符的当前文件偏移量
fprintf(stdout,"offset of 2 is %d\n",lseek(2,0,SEEK_CUR));
exit(0);
}
代码执行结果:
实验结果说明0号文件描述符和1号文件描述符指向的是同一个文件表项
实验结论
初步认定猜想二正确