それでは、POSIXを使用してUnix / Linuxでプロセスを実行できますが、プロセスのSTDOUTとSTDERRをファイルに保存/リダイレクトする方法はありますか?ヘッダーにspawn.h
関連性があるように見える減速が含まれていますが、posix_spawn_file_actions_adddup2
それを使用する方法がわかりません。
プロセスは以下を生成します。
posix_spawn(&processID, (char *)"myprocess", NULL, NULL, args, environ);
出力保存:
...?
ベストアンサー1
以下は、生成プロセスのファイル記述子を変更する最小の例ですfoo.c
。
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <spawn.h>
int main(int argc, char* argv[], char *env[])
{
int ret;
pid_t child_pid;
posix_spawn_file_actions_t child_fd_actions;
if (ret = posix_spawn_file_actions_init (&child_fd_actions))
perror ("posix_spawn_file_actions_init"), exit(ret);
if (ret = posix_spawn_file_actions_addopen (&child_fd_actions, 1, "/tmp/foo-log",
O_WRONLY | O_CREAT | O_TRUNC, 0644))
perror ("posix_spawn_file_actions_addopen"), exit(ret);
if (ret = posix_spawn_file_actions_adddup2 (&child_fd_actions, 1, 2))
perror ("posix_spawn_file_actions_adddup2"), exit(ret);
if (ret = posix_spawnp (&child_pid, "date", &child_fd_actions, NULL, argv, env))
perror ("posix_spawn"), exit(ret);
}
それは何をしますか?
- の3番目のパラメータは(指定された)型
posix_spwan
のポインタです。呼び出しプロセスから継承されたファイル記述子は、オブジェクトで指定されているように開かれ、閉じられたり、コピーされます。posix_spawn_file_actions_t
NULL
posix_spawn
posix_spawn_file_actions_t
- だから私たちは
posix_spawn_file_actions_t
オブジェクト(chiild_fd_actions
)で始まり、それで初期化しますposix_spawn_file_actions_init()
。 - これらの関数を使用して、それぞれファイルディスクリプタ(および関数の
posix_spawn_file_actions_{addopen,addclose,addup2}
後ろ)を開いたり閉じたりすることができます。open(3)
close(3)
dup2(3)
- だから私たちはファイル記述子(標準出力とも呼ばれる)に
posix_spawn_file_actions_addopen
ファイルを置きます。/tmp/foo-log
1
- 次に
posix_spawn_file_actions_adddup2
fd2
(別名stderr
)をfd 1にします。 - 何も開いたりなりすましたりしません。しかし、。最後の2つの関数は、単に
child_fd_actions
これらの操作を説明するためにオブジェクトを変更します。 - 最後に、私たちはオブジェクト
posix_spawn
を扱います。child_fd_actions
テストを受けてください:
$ make foo
cc foo.c -o foo
$ ./foo
$ cat /tmp/foo-log
Sun Jan 3 03:48:17 IST 2016
$ ./foo +'%F %R'
$ cat /tmp/foo-log
2016-01-03 03:48
$ ./foo -d 'foo'
$ cat /tmp/foo-log
./foo: invalid date ‘foo’
ご覧のとおり、生成プロセスのstdoutとstderrの両方が/tmp/foo-log
。