ファイルディスクリプタの複製は 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; }
参考