ファイルIO操作(06)――dupとdup 2関数

6445 ワード

8、dupとdup 2関数


#include
int dup(int oldfd);
int dup2(int oldfd, int newfd);
#define _GNU_SOURCE/* See feature_test_macros(7) */
#include /*可視プログラムの利点テストマクロ*/
int dup3(int oldfd, int newfd, int flags);
-------------------------------------------------------------------------------------------------
oldfd:既存のファイル記述子
新fd:新しいファイル記述子
flags:
システムはこれらの関数createを呼び出してoldfdをコピーするファイル記述子を作成する.新しいファイルと古い2つのファイル記述子は、同じファイル(同じファイルテーブルアイテムを共有)を指します.
dup()はoldfdファイル記述子をコピーし、新しいファイル記述子として最小の割り当てられていないファイル記述子を返す.
dup 2()は、新しいファイル記述子として整数を指定するために使用され、newfdが開いているファイルに関連付けられている場合は、開いているファイルが先に閉じられます.newfdとoldfdが等しい場合は、直接newfdに戻り、ファイルは閉じません.
dup 3()はdup 2()とほぼ同じですが、呼び出し者はclose-on-execタグを新しいファイル記述子のフラグ指定O_に設定できます.CLOEXEC .残りはopen(2)の説明を参照してください.
oldfdがnewfdに等しい場合、dup 3()は呼び出しに失敗し、errorをEINVALに設定します.
-------------------------------------------------------------------------------------------------
RETURN VALUE
新しいファイル記述子newfdを正常に返しました.エラーは-1を返し、errnoを設定します.
ERRORS
EBADF oldfdは開いているファイル記述子ではないか、newfdは許容範囲内のファイル記述子を示している.
EBUSY(Linuxのみ)は、dup 2()またはdup 3()とopenrace条件open(2)およびdup()を返す可能性があります.
EINTR dup 2()またはdup 3()呼び出しは信号によって中断される.signal(7)を参照してください.
EINVAL(dup 3()フラグに無効な値が含まれています.または、oldfdはnewfdに等しい.
EMFILEプロセスは、ファイル記述子の最大数のファイルを開いてから、新しいファイルを開いてみました.ファイル記述子が割り当てられていません.

dup 2 STDOUT_FILENOファイルへリダイレクト

   1: #include <unistd.h>     //open,dup2,close...
   2: #include <stdio.h>
   3: #include <stdlib.h>
   4: #include <string.h>
   5: #include <fcntl.h>      //O_WRONLY  
   6: #include <sys/types.h>
   7: #include <sys/stat.h>   //umask
   8: int main()
   9: {
  10:     //set umask (only in this program)
  11:     umask(0);
  12:     // , 0.
  13:     int fd=open("1.txt",O_WRONLY | O_CREAT | O_TRUNC,664);
  14:     // STDOUT_FILENO STDOUT_FILENO fd
  15:     int fd2=dup2(fd,STDOUT_FILENO);
  16:     char buf[1024]={0};
  17:     while(strncmp(buf,"exit",4)){
  18:         scanf("%s",buf);    
  19:         printf("%s
"
,buf);
  20:     }
  21:     close(fd);
  22:     return 0;
  23: }
  fcntl 
   1: #include <unistd.h>     //open,dup2,close...
   2: #include <stdio.h>
   3: #include <stdlib.h>
   4: #include <string.h>
   5: #include <fcntl.h>      //O_WRONLY  
   6: #include <sys/types.h>
   7: #include <sys/stat.h>   //umask
   8: int main()
   9: {
  10:     //set umask (only in this program)
  11:     umask(0);
  12:         //open a file,only write mode,if file exist ,trunc
  13:     int fd=open("2.txt",O_WRONLY | O_CREAT | O_TRUNC,664);
  14:     //dup2,fd copy to stdout
  15:     //int fd2=dup2(fd,STDOUT_FILENO);
  16:     
  17:     close(STDOUT_FILENO);
  18:     // fd STDOUT_FILENO
  19:     fcntl(fd,F_DUPFD,STDOUT_FILENO);
  20:  
  21:     char buf[1024]={0};
  22:     while(strncmp(buf,"exit",4)){
  23:         scanf("%s",buf);    
  24:         printf("%s
"
,buf);
  25:     }
  26:  
  27:     close(fd);
  28:     return 0;
  29: }