【Linuxシステムプログラミング】19.dup、dup2

目次

ダップ

パラメータoldfd

戻り値

テストコード1

試験結果

dup2

パラメータoldfd

パラメータ newfd

戻り値

テストコード2

試験結果

テストコード3

試験結果

ファイルのリダイレクト。

 

ダップ

        ファイル記述子のコピー。既存のファイル記述子を使用して新しいファイル記述子をコピーして生成します。関数呼び出しの前後の 2 つのファイル記述子は同じファイルを指します。後で使用できるように保存してください。

man 2 dup

 

パラメータoldfd

すでにファイル記述子が存在します。

戻り値

新しいファイル記述子。

テストコード1

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd = open(argv[1], O_RDWR);		//得到一个文件描述符
    int fd1 = dup(fd);		//文件描述符拷贝
    printf("fd=%d\n", fd);
    printf("fd1=%d\n", fd1);
    close(fd);
    close(fd1);
    return 0;
}

試験結果

dup2

        ファイル記述子のコピー。リダイレクトされたファイル記述子は を指します。この機能により、コマンドラインの「リダイレクト」機能が実現できます。元々ファイルを指していたファイル記述子が、指定された他のファイルを指すようにします。

man 2 dup2

パラメータoldfd

既存のファイル記述子。

パラメータ newfd

リダイレクトされるファイル記述子。

戻り値

成功: 新しいFD

失敗: -1

テストコード2

        2 つのファイルを読み取り、2 番目のファイル記述子の最初のファイル記述子へのリダイレクトを変更してから、コンテンツを 2 番目のファイル記述子に書き込み、1 のファイル記述子を変更して最初のファイル (ターミナル出力コンテンツ) にリダイレクトします。

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd1 = open(argv[1], O_RDWR);
    int fd2 = open(argv[2], O_RDWR);
    int flag;
    flag= dup2(fd1, fd2);		//fd2文件描述符重定向到fd1文件描述符
    flag=write(fd2,"hello world!",12);
    if(flag<0){
        perror("write error");
    }
    dup2(fd1,STDOUT_FILENO);		//终端输出重定向到fd1
    printf("\n你好,世界!\n");
    close(fd1);
    close(fd2);
    return 0;
}

試験結果

テストコード3

dupの機能はfcntlによって実現されます。

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd1 = open(argv[1], O_RDWR);
    printf("fd1:%d\n", fd1);
    int fd2=fcntl(fd1,F_DUPFD,0);	//已被占用的文件描述符,返回最小可用的
    printf("fd2:%d\n",fd2);
    int fd3=fcntl(fd1,F_DUPFD,7);	//未被占用的文件描述符,返回该值
    printf("fd3:%d\n",fd3);
    close(fd1);
    close(fd2);
    close(fd3);
    return 0;
}

試験結果

おすすめ

転載: blog.csdn.net/CETET/article/details/131026114