2013-05-08 6 views
1

Я бы знать, почему DUP всегда возвращает нули в следующем коде (в котором открыт файл, чем 10 DUP делаются последовательно):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); 

     } 

} 

Когда я запустить программу (на 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" ?!

Althought страницы человека состояния, возвращаемое значение должно быть дескриптор файла:

ВОЗВРАТ СТОИМОСТИ В случае успеха, эти системные вызовы возвращают новый дескриптор. При ошибке возвращается -1, а errno устанавливается соответствующим образом.

Я не понимаю, почему я получаю всегда «0», зная, что я не использовал близко операцию.

Пожалуйста, помогите.

+0

+1 для чтения страницы руководства. – devnull

ответ

5

Ошибка в вашем состоянии:

(fdd = dup(fdo) < 0) 

Переменная fdd становится результатом dup(fdo) < 0. Вам необходимо проверить свои круглые скобки:

(fdd = dup(fdo)) < 0