我想知道为什么 dup 总是在以下代码中返回零(其中打开一个文件,而不是连续完成10个重复):
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
void main()
{
int i,fdo,fdd;
if((fdo = open("test", O_RDWR | O_CREAT, 0666)) < 0)
{
perror("main open");
return;
}
printf("main open: %d\n",fdo);
for(i=0; i< 10;i++)
{
if((fdd = dup(fdo) < 0 )) {
perror("dup");
return ;
}
printf("opened %d, duped: %d \n", fdo,fdd);
}
}
当我运行程序时(在linux 2.6.32-279.19.1.el6.i686,Netbsd或Solaris 5.9上) ,我得到以下结果:
main open: 3
opened 3, duped: 0
opened 3, duped: 0
opened 3, duped: 0
opened 3, duped: 0
opened 3, duped: 0
opened 3, duped: 0
opened 3, duped: 0
opened 3, duped: 0
opened 3, duped: 0
opened 3, duped: 0
dup的返回值总是“0”?!
虽然man page声明返回值应该是文件描述符:
返回值 成功时,这些系统调用将返回新的描述符。出错时,返回-1,并正确设置errno。
我不明白为什么我总是“0”,知道我没有使用关闭操作。
请帮助。
答案 0 :(得分:5)
错误符合您的条件:
(fdd = dup(fdo) < 0)
变量fdd
成为dup(fdo) < 0
的结果。你需要检查你的括号:
(fdd = dup(fdo)) < 0