[ C 言語 ] ファイルディスクリプタを複製する ( dup2 )

Pocket

ファイルディスクリプタの複製は dup2 システムコールを使用して行うことができます。ここでは、簡単な dup2 システムコールの使用サンプルを掲載しています。

スポンサーリンク


サンプルコードの処理内容は、以下のコマンドの処理を実装しています。

# ls の出力結果を output ファイルに出力する
ls > output
サンプルコード
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char** argv)
{
    pid_t pid;
    int status;
    int fd;

    // プロセスを作成する
    pid = fork();
    // プロセスの作成に失敗
    if ( pid < 0 ) {
        perror("fork()");
        return -1;
    }

    // 子プロセスである場合は、0がリターンされる
    if (pid == 0) {

        // ファイルオープン
        fd = open("./output", O_CREAT | O_WRONLY, 0666);

        /*
         * オープンしたファイルのディスクリプタを
         * 標準出力に複製する
         */
        dup2(fd, stdout);
        close(fd); // 作成したディスクリプタはクローズ

        /*
         * プロセスを乗せかえる
         * ls の出力結果はファイル output に出力される
         */
        execl("/bin/ls", "ls", (char *)NULL);

    } else { // 親プロセスの場合は、作成した子プロセスのPIDがリターンされる

        // 子プロセスの終了を待つ
        waitpid(pid, &status, 0);
        printf ("child process (PID = %d) finished\n", pid);
    }

    return 0;
}
参考

 

スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>