그래 넌 할수있어. 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
기능은 대부분의 다른 UNIX 기능과는 달리, 그들은 오류 코드를 반환하는 대신, errno를 설정하지 마십시오. 따라서 우리는 사용할 수 perror()
없지만 같은 것을 사용해야합니다 strerror()
.
스폰 파일 액션 인 addopen과 addup2를 사용합니다. addopen은 일반과 비슷 open()
하지만 이미 열려 있으면 자동으로 닫히는 파일 디스크립터도 지정합니다 (여기서 1, stdout). addup2는 1과 dup2()
2가 복제되기 전에 대상 파일 디스크립터 (여기서 2, 즉 stderr)가 원자 적으로 닫힙니다 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에서 어떤 일이 발생하는지 나타내는 데 사용됩니다.