আমি প্রোগ্রাম করি যা আমি সি ফর্ক () 'র একটি শিশু প্রক্রিয়া বন্ধ করে লিখেছি। কোনও প্রক্রিয়াও শেষ হবে না। আমি যদি কমান্ড লাইন থেকে প্রোগ্রামটি চালু করি এবং নিয়ন্ত্রণ-সি টিপুন তবে কোন প্রক্রিয়া (এস) বাধা সংকেত পাবে?
আমি প্রোগ্রাম করি যা আমি সি ফর্ক () 'র একটি শিশু প্রক্রিয়া বন্ধ করে লিখেছি। কোনও প্রক্রিয়াও শেষ হবে না। আমি যদি কমান্ড লাইন থেকে প্রোগ্রামটি চালু করি এবং নিয়ন্ত্রণ-সি টিপুন তবে কোন প্রক্রিয়া (এস) বাধা সংকেত পাবে?
উত্তর:
কেন আমরা এটি চেষ্টা করে দেখতে পারি না? পিতা-মাতা এবং শিশু উভয় প্রক্রিয়াকে signal(3)ফাঁদে ফেলতে SIGINTএবং প্রক্রিয়াটি পৌঁছে দেওয়ার সময় একটি বার্তা প্রিন্ট করে ব্যবহার করার জন্য এখানে একটি তুচ্ছ প্রোগ্রাম ।
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void parent_trap(int sig) {fprintf(stderr, "They got back together!\n");}
void child_trap(int sig) {fprintf(stderr, "Caught signal in CHILD.\n");}
int main(int argc, char **argv) {
if (!fork()) {
signal(SIGINT, &child_trap);
sleep(1000);
exit(0);
}
signal(SIGINT, &parent_trap);
sleep(1000);
return 0;
}
চল যে কল test.c। এখন আমরা এটি চালাতে পারি:
$ gcc test.c
$ ./a.out
^CCaught signal in CHILD.
They got back together!
টার্মিনালে উত্পন্ন বিঘ্নিত সংকেতগুলি সক্রিয় প্রক্রিয়া গোষ্ঠীতে সরবরাহ করা হয়, যেখানে এখানে পিতামাতা এবং শিশু উভয়ই অন্তর্ভুক্ত রয়েছে । আপনি দেখতে পাচ্ছেন যে উভয়ই কার্যকর হয়েছিল child_trapএবং parent_trapযখন আমি চাপলাম তখন Ctrl- C।
একটা হল মধ্যে পারস্পরিক ক্রিয়ার লম্বা আলোচনা forkPOSIX এবং সংকেত । এখানে এর সবচেয়ে উপাদান অংশটি হ'ল:
কাঁটাচামচ () এর পরে প্রক্রিয়া গোষ্ঠীতে প্রেরিত একটি সংকেত পিতামাতা এবং সন্তানের উভয়কেই সরবরাহ করা উচিত।
তারা আরও লক্ষ করে যে কিছু সিস্টেম সম্ভবত সঠিক উপায়ে আচরণ করতে পারে না, বিশেষত যখন সংকেতের সময়টির খুব কাছাকাছি আসে fork()। আপনি সেই সিস্টেমে যে কোনও একটিতে আছেন কিনা তা নির্ধারণের জন্য সম্ভবত কোড পড়া বা প্রচুর ভাগ্য প্রয়োজন, কারণ প্রতিটি পৃথক প্রয়াসে মিথস্ক্রিয়াগুলি সম্ভাব্য নয়।
অন্যান্য দরকারী পয়েন্টগুলি হ'ল:
kill) কেবলমাত্র সেই প্রক্রিয়াতে সরবরাহ করা হবে, তা পিতা-মাতা বা সন্তান নির্বিশেষে।SIGINTকোড (ডিফল্ট আচরণ) দিয়ে প্রস্থান করবে ।