হ্যা, তুমি পারো. পোস্টিক্স স্প্যান ফাইলের ক্রিয়াগুলির সঠিক তালিকাটি নির্ধারণ করা অবশ্যই যাওয়ার উপায়।
উদাহরণ:
#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
ফাংশনগুলি ভুল নির্ধারণ করে না, পরিবর্তে, অন্যান্য ইউনিক্স ফাংশনগুলির বিপরীতে, তারা একটি ত্রুটি কোড দেয়। সুতরাং, আমরা ব্যবহার করতে পারি না perror()
তবে এর মতো কিছু ব্যবহার করতে হবে strerror()
।
আমরা দুটি স্প্যান ফাইল ক্রিয়া ব্যবহার করি: অ্যাডোপেন এবং অ্যাডআপ 2। অ্যাডোপেনটি একটি সাধারণের অনুরূপ open()
তবে আপনি কোনও ফাইল বর্ণনাকারী নির্দিষ্ট করে যা ইতিমধ্যে খোলা থাকলে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায় (এখানে 1, মানে স্টাডআউট)। অ্যাডআপ 2 এর অনুরূপ প্রভাব রয়েছে dup2()
, যেমন লক্ষ্য ফাইল বর্ণনাকারী (এখানে 2, অর্থাৎ স্ট্যাডার) 1 টি 2 টি নকল হওয়ার আগেই পরমাণুভাবে বন্ধ হয়ে যায় Those এই ক্রিয়াগুলি কেবলমাত্র নির্মিত posix_spawn
কমান্ডের দ্বারা নির্ধারিত কমান্ডটি কার্যকর করার আগে ডেকে তৈরি করা হয় in
ভালো লেগেছে 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 ঘটবে ব্যবহার করা হয়।