Ya kamu bisa. Menentukan daftar yang tepat dari tindakan file spawn posix pasti adalah cara untuk pergi.
Contoh:
#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;
}
Kompilasi dan uji:
$ 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
Perhatikan bahwa posix_spawn
fungsi - fungsi tidak mengatur errno, sebaliknya, tidak seperti kebanyakan fungsi UNIX lainnya, mereka mengembalikan kode kesalahan. Jadi, kita tidak bisa menggunakan perror()
tetapi harus menggunakan sesuatu seperti strerror()
.
Kami menggunakan dua tindakan file spawn: addopen dan addup2. Addopen mirip dengan normal open()
tetapi Anda juga menentukan deskriptor file yang secara otomatis ditutup jika sudah terbuka (di sini 1, yaitu stdout). Addup2 memiliki efek yang mirip dengan dup2()
, yaitu deskriptor file target (di sini 2, yaitu stderr) ditutup secara atom sebelum 1 diduplikasi ke 2. Tindakan-tindakan tersebut hanya dijalankan pada anak yang dibuat oleh posix_spawn
, yaitu tepat sebelum ia menjalankan perintah yang ditentukan.
Suka fork()
, posix_spawn()
dan posix_spawnp()
segera kembali ke orang tua. Dengan demikian, kita harus menggunakan waitid()
atau waitpid()
secara eksplisit menunggu child_pid
penghentian.
posix_spwan
adalah pointer tipeposix_spawn_file_actions_t
(yang telah Anda berikan sebagaiNULL
).posix_spawn
akan membuka, menutup, atau menggandakan deskriptor file yang diwarisi dari proses pemanggilan sebagaimana ditentukan olehposix_spawn_file_actions_t
objek. Theposix_spawn_file_actions_{addclose,adddup2}
fungsi yang digunakan untuk menunjukkan apa yang terjadi pada yang fd.