हाँ तुम कर सकते हो। पॉज़िक्स स्पॉन फ़ाइल क्रियाओं की सही सूची को परिभाषित करना निश्चित रूप से जाने का तरीका है।
उदाहरण:
#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 फ़ंक्शन के विपरीत, वे एक त्रुटि कोड लौटाते हैं। इस प्रकार, हम उपयोग नहीं कर सकते हैं perror()
लेकिन ऐसा कुछ उपयोग करना होगा strerror()
।
हम दो स्पॉन फ़ाइल क्रियाओं का उपयोग करते हैं: Addopen और addup2। Addopen एक सामान्य के समान है, open()
लेकिन आप एक फ़ाइल डिस्क्रिप्टर भी निर्दिष्ट करते हैं, जो पहले से ही खुला होने पर स्वतः बंद हो जाता है (यहाँ 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}
कार्यों से संकेत मिलता है क्या जो एफडी के लिए होता उपयोग किया जाता है।