দেখা যাচ্ছে clone()
লিনাক্স ২.6 এ দুটি জিনিস ভাসমান
একটি সিস্টেম কল আছে:
int clone(int (*fn)(void *), void *child_stack,
int flags, void *arg, ...
/* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );
এটি করা দ্বারা বর্ণিত "ক্লোন ()" man 2 clone
।
আপনি যদি সেই ম্যান পৃষ্ঠাটি খুব কাছে থেকে পড়ে থাকেন তবে আপনি এটি দেখতে পাবেন:
It is actually a library function layered on top of the
underlying clone() system call.
স্পষ্টতই, আপনি বিভ্রান্তিকরভাবে অভিন্ন নামকরণ করা সিস্টেম কলটিতে স্তরযুক্ত "গ্রন্থাগার ফাংশন" ব্যবহার করে থ্রেডিং বাস্তবায়ন করার কথা।
আমি একটি ছোট প্রোগ্রাম লিখেছি:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int
main(int ac, char **av)
{
pid_t cpid;
switch (cpid = fork()) {
case 0: // Child process
break;
case -1: // Error
break;
default: // parent process
break;
}
return 0;
}
এটি দিয়ে সংকলিত:, c99 -Wall -Wextra
এবং strace -f
সিস্টেম কলিং আসলে কী করে তা দেখার জন্য এটি চালিয়ে যান । আমি strace
এটি লিনাক্স 2.6.18 মেশিনে (x86_64 সিপিইউ) পেয়েছি :
20097 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x2b4ee9213770) = 20098
20097 exit_group(0) = ?
20098 exit_group(0)
strace
আউটপুটে কোনও "কাঁটাচামচ" কল উপস্থিত নেই । clone()
কল যে শো আপ strace
আউটপুট মনুষ্যসৃষ্ট পৃষ্ঠা-ক্লোন থেকে ভিন্ন আর্গুমেন্ট নেই। child_stack=0
প্রথম যুক্তি হিসাবে পৃথক int (*fn)(void *)
।
দেখা যাচ্ছে যে fork(2)
সিস্টেম কল পরিপ্রেক্ষিতে বাস্তবায়িত হয় বাস্তব clone()
, শুধু মত "গ্রন্থাগার ফাংশন" clone()
বাস্তবায়িত হয়। বাস্তব clone()
মানুষের পৃষ্ঠা-ক্লোন থেকে আর্গুমেন্ট একটি ভিন্ন সেট আছে।
সরলবাদীভাবে, উভয় সম্পর্কে আপাতদৃষ্টিতে বিরোধী বিবৃতি fork()
এবং clone()
সঠিক। জড়িত "ক্লোন" যদিও আলাদা।