ใช่คุณสามารถ. การกำหนดรายการที่ถูกต้องของการกระทำของไฟล์ posix วางไข่แน่นอนเป็นวิธีที่จะไป
ตัวอย่าง:
#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;
}
รวบรวมและทดสอบ:
$ 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
โปรดทราบว่าposix_spawn
ฟังก์ชั่นไม่ได้ตั้งค่า errno แทนซึ่งแตกต่างจากฟังก์ชั่น UNIX อื่น ๆ ส่วนใหญ่พวกเขากลับรหัสข้อผิดพลาด ดังนั้นเราจึงไม่สามารถใช้แต่ต้องใช้สิ่งที่ต้องการperror()
strerror()
เราใช้การกระทำของไฟล์วางไข่สองรายการ: addopen และ addup2 addopen คล้ายกับปกติopen()
แต่คุณยังระบุ file descriptor ซึ่งจะถูกปิดโดยอัตโนมัติถ้าเปิดอยู่แล้ว (ที่นี่ 1, คือ stdout) addup2 นั้นมีเอฟเฟกต์ที่คล้ายคลึงกันdup2()
เช่นตัวอธิบายไฟล์เป้าหมาย (ที่นี่ 2 คือ stderr) ถูกปิดแบบอะตอมก่อนที่ 1 จะถูกทำซ้ำเป็น 2 การกระทำเหล่านั้นจะถูกดำเนินการในเด็กที่สร้างขึ้นโดยposix_spawn
ก่อนหน้าคำสั่งที่ระบุ
ชอบfork()
, posix_spawn()
และposix_spawnp()
ทันทีที่กลับไปยังผู้ปกครอง ดังนั้นเราต้องใช้waitid()
หรือwaitpid()
รอการchild_pid
ยกเลิกอย่างชัดเจน
posix_spwan
เป็นตัวชี้ประเภทposix_spawn_file_actions_t
(หนึ่งที่คุณให้เป็นNULL
)posix_spawn
จะเปิดปิดหรืออธิบายไฟล์ซ้ำที่สืบทอดมาจากกระบวนการเรียกตามที่ระบุโดยposix_spawn_file_actions_t
วัตถุposix_spawn_file_actions_{addclose,adddup2}
ฟังก์ชั่นที่ใช้ในการบ่งบอกถึงสิ่งที่เกิดขึ้นที่ FD