C

獲取posix_spawn的輸出

  • November 3, 2018

所以我可以使用 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_adddup2fd 2(aka stderr) 到 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.

引用自:https://unix.stackexchange.com/questions/252901