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