dup返回值始终为零

tso*_*ohg 1 c posix file dup

我想知道为什么dup总是在以下代码中返回零(其中打开一个文件,连续完成10个dup):

#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);

        }

}
Run Code Online (Sandbox Code Playgroud)

当我运行程序时(在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 
Run Code Online (Sandbox Code Playgroud)

dup的返回值总是"0"?!

虽然手册页声明返回值应该是文件描述符:

返回值成功时,这些系统调用将返回新的描述符.出错时,返回-1,并正确设置errno.

我不明白为什么我总是"0",知道我没有使用关闭操作.

请帮忙.

Som*_*ude 5

错误在您的情况下:

(fdd = dup(fdo) < 0)
Run Code Online (Sandbox Code Playgroud)

变量fdd成为结果dup(fdo) < 0.你需要检查你的括号:

(fdd = dup(fdo)) < 0 
Run Code Online (Sandbox Code Playgroud)