C獲取
獲取posix_spawn
的輸出
所以我可以使用 POSIX 在 Unix/Linux 中執行一個程序,但是有什麼方法可以將程序的 STDOUT 和 STDERR 儲存/重定向到文件?標題
spawn.h
包含一個posix_spawn_file_actions_adddup2
看起來相關的減速,但我不太確定如何使用它。程序產生:
posix_spawn(&processID, (char *)"myprocess", NULL, NULL, args, environ);
輸出儲存:
...?
這是修改衍生程序的文件描述符的最小範例,另存為
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); }
它有什麼作用?
- 第三個參數
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
(akastderr
) 到 fd 1。- 請注意,尚未打開或欺騙任何內容。最後兩個函式只是簡單地更改了對
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
.