Evet yapabilirsin. Posix spawn dosya eylemlerinin doğru listesini tanımlamak kesinlikle yoludur.
Misal:
#include <errno.h>
#include <fcntl.h>
#include <spawn.h>
#include <stdio.h>
#include <string.h>
#define CHECK_ERROR(R, MSG) do { if (R) { fprintf(stderr, "%s: %s\n",
(MSG), strerror(R)); return 1; } } while (0)
extern char **environ;
int main(int argc, char **argv)
{
if (argc < 3) {
fprintf(stderr, "Call: %s OUTFILE COMMAND [ARG]...\n", argv[0]);
return 2;
}
const char *out_filename = argv[1];
char **child_argv = argv+2;
posix_spawn_file_actions_t as;
int r = posix_spawn_file_actions_init(&as);
CHECK_ERROR(r, "actions init");
r = posix_spawn_file_actions_addopen(&as, 1, out_filename,
O_CREAT | O_TRUNC | O_WRONLY, 0644);
CHECK_ERROR(r, "addopen");
r = posix_spawn_file_actions_adddup2(&as, 1, 2);
CHECK_ERROR(r, "adddup2");
pid_t child_pid;
r = posix_spawnp(&child_pid, child_argv[0], &as, NULL,
child_argv, environ);
CHECK_ERROR(r, "spawnp");
r = posix_spawn_file_actions_destroy(&as);
CHECK_ERROR(r, "actions destroy");
return 0;
}
Derleyin ve test edin:
$ cc -Wall -g -o spawnp spawnp.c
$ ./spawnp log date -I
$ cat log
2018-11-03
$ ./a.out log dat
spawnp: No such file or directory
O Not posix_spawnişlevleri diğer çoğu UNIX işlevleri farklı olarak, bir hata kodu döndürür, bunun yerine, errno yoktur. Bu yüzden kullanamayız perror()ama böyle bir şey kullanmak zorundayız strerror().
İki spawn dosya işlemi kullanıyoruz: addopen ve addup2. Addopen normal bir modele benzer, open()ancak zaten açıksa (burada 1, yani stdout) otomatik olarak kapatılan bir dosya tanımlayıcı da belirtirsiniz. Eklenti2, 1'e dup2()2 kopyalanmadan önce hedef dosya tanımlayıcısına (burada 2, yani stderr) benzer etkilere sahiptir . Bu eylemler yalnızca oluşturulan alt posix_spawnöğede, yani belirtilen komutu çalıştırmadan hemen önce yürütülür .
Gibi fork(), posix_spawn()ve posix_spawnp()hemen ebeveyn dönün. Bu nedenle, sonlandırmayı kullanmak waitid()veya waitpid()açıkça beklemek zorundayız child_pid.
posix_spwanbir tür göstericidirposix_spawn_file_actions_t(sizin belirttiğinizNULL). nesneposix_spawntarafından belirtilen çağrı sürecinden miras alınan dosya tanımlayıcılarını açar, kapatır veya çoğaltırposix_spawn_file_actions_t.posix_spawn_file_actions_{addclose,adddup2}İşlevler hangi fd ne olacağını belirtmek için kullanılır.