Jadi saya bisa menjalankan proses di Unix / Linux menggunakan POSIX, tetapi apakah ada cara saya bisa menyimpan / mengarahkan STDOUT dan STDERR dari proses ke file? The spawn.h
header berisi perlambatan posix_spawn_file_actions_adddup2
yang terlihat relevan, tapi aku tidak yakin cukup bagaimana menggunakannya.
Proses menelurkan:
posix_spawn(&processID, (char *)"myprocess", NULL, NULL, args, environ);
Penyimpanan output:
...?
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.Jawaban:
Berikut adalah contoh minimal memodifikasi deskriptor file dari proses spawned, disimpan sebagai
foo.c
:Apa fungsinya?
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.posix_spawn_file_actions_t
objek (chiild_fd_actions
), dan menginisialisasi denganposix_spawn_file_actions_init()
.posix_spawn_file_actions_{addopen,addclose,addup2}
fungsi dapat digunakan untuk membuka, menutup, atau menggandakan deskriptor file (setelahopen(3)
,close(3)
dandup2(3)
fungsi) masing-masing.posix_spawn_file_actions_addopen
file di/tmp/foo-log
ke file descriptor1
(alias stdout).posix_spawn_file_actions_adddup2
fd2
(aliasstderr
) ke fd 1.child_fd_actions
objek untuk mencatat bahwa tindakan ini harus diambil.posix_spawn
denganchild_fd_actions
objek.Mengujinya:
Seperti yang Anda lihat, baik stdout dan stderr dari proses melahirkan pergi ke
/tmp/foo-log
.sumber
posix_spawn*
jangan atur errno. Dengan demikian, Anda tidak dapat menggunakannyaperror()
. Gunakan sesuatu sepertifprintf(stderr, "...: %s\n", strerror(ret))
sebagai gantinya. Juga, fungsi utama tidak memilikireturn 0
pernyataan.Ya kamu bisa. Menentukan daftar yang tepat dari tindakan file spawn posix pasti adalah cara untuk pergi.
Contoh:
Kompilasi dan uji:
Perhatikan bahwa
posix_spawn
fungsi - fungsi tidak mengatur errno, sebaliknya, tidak seperti kebanyakan fungsi UNIX lainnya, mereka mengembalikan kode kesalahan. Jadi, kita tidak bisa menggunakanperror()
tetapi harus menggunakan sesuatu sepertistrerror()
.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 dengandup2()
, 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 olehposix_spawn
, yaitu tepat sebelum ia menjalankan perintah yang ditentukan.Suka
fork()
,posix_spawn()
danposix_spawnp()
segera kembali ke orang tua. Dengan demikian, kita harus menggunakanwaitid()
atauwaitpid()
secara eksplisit menungguchild_pid
penghentian.sumber