1

次のコードで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);

        }

}

プログラムを実行すると (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」!?

マニュアルページには、戻り値はファイル記述子である必要があると記載されていますが:

戻り値 成功すると、これらのシステム コールは新しい記述子を返します。エラーの場合は -1 が返され、errno が適切に設定されます。

閉じる操作を使用していないことを知っているのに、なぜ常に「0」になるのかわかりません。

助けてください。

4

1 に答える 1

5

エラーはあなたの状態にあります:

(fdd = dup(fdo) < 0)

変数fddは の結果になりdup(fdo) < 0ます。かっこを確認する必要があります。

(fdd = dup(fdo)) < 0 
于 2013-05-08T07:20:38.627 に答える