আপনি যখন কল করবেন তখন vfork()
একটি নতুন প্রক্রিয়া তৈরি হয় এবং সেই নতুন প্রক্রিয়াটি স্ট্যাকটি বাদ দিয়ে পিতামাতার প্রক্রিয়াটির চিত্রটি ধার করে। শিশু প্রক্রিয়াটিকে একটি নতুন স্ট্যাক স্টার দেওয়া হয় তবে return
যে ফাংশনটি ডেকে আনে সেগুলি অনুমতি দেয় না vfork()
।
শিশু চলমান অবস্থায়, পিতামাতার ঠিকানা স্থান ধার করার সাথে সাথে পিতামাতার প্রক্রিয়াটি অবরুদ্ধ থাকে।
আপনি যা-ই করুন না কেন, কেবল স্ট্যাকটি অ্যাক্সেস করে এমন সমস্ত কিছুই কেবলমাত্র শিশুর ব্যক্তিগত স্ট্যাককেই পরিবর্তন করে। আপনি যদি তবে বিশ্বব্যাপী ডেটা পরিবর্তন করেন তবে এটি সাধারণ তথ্য পরিবর্তন করে এবং এটি পিতামাতাকেও প্রভাবিত করে।
বিশ্বব্যাপী ডেটা সংশোধনকারী জিনিসগুলি হ'ল:
কলিং ম্যালোক () বা ফ্রি ()
stdio ব্যবহার করে
সংকেত সেটিংস পরিবর্তন করে
ভেরিয়েবল যে ফাংশন যে নামে স্থানীয় নয় পরিবর্তন vfork()
।
...
একবার আপনি কল করলে _exit()
(গুরুত্বপূর্ণ, কখনও কল করবেন না exit()
), সন্তানের সমাপ্তি হবে এবং নিয়ন্ত্রণটি পিতামাতার কাছে ফিরে দেওয়া হবে।
আপনি যদি exec*()
পরিবার থেকে কোনও ফাংশন কল করেন তবে নতুন প্রোগ্রাম কোড, নতুন ডেটা এবং অভিভাবকের কাছ থেকে স্ট্যাকের একটি অংশ দিয়ে একটি নতুন ঠিকানার স্থান তৈরি করা হবে (নীচে দেখুন)। এটি প্রস্তুত হয়ে গেলে, শিশু আর ঠিকানার কাছ থেকে ঠিকানা স্থান ধার করে না, তবে একটি নিজস্ব ঠিকানার স্থান ব্যবহার করে।
নিয়ন্ত্রণটি পিতামাতাকে ফেরত দেওয়া হয়েছে, কারণ এটির ঠিকানা স্থানটি আর কোনও প্রক্রিয়া দ্বারা ব্যবহৃত হয় না।
গুরুত্বপূর্ণ: লিনাক্সে, বাস্তব vfork()
বাস্তবায়ন নেই। লিনাক্স বরং ১৯৮৮ সালে সুনোস -৪.০ দ্বারা প্রবর্তিত vfork()
কপিরাইট অন রাইটিং fork()
ধারণার উপর ভিত্তি করে প্রয়োগ করে users ব্যবহারকারীরা যাতে তারা ব্যবহার করেন তা বিশ্বাস করার জন্য vfork()
, লিনাক্স কেবল ভাগ করা ডেটা সেট করে এবং সন্তানের কাছে কল দেয় না _exit()
বা কোনও একটি exec*()
ফাংশন না দিয়ে পিতামাতাকে সাসপেন্ড করে ।
তাই লিনাক্স এই সত্য থেকে উপকৃত হয় না যে কোনও vfork()
বাস্তবের কার্নেলের মধ্যে সন্তানের জন্য ঠিকানা স্থানের বিবরণ স্থাপন করতে হবে না। এর vfork()
চেয়ে দ্রুত নয় এমনটির ফলাফল fork()
। যে সিস্টেমে কোনও বাস্তব বাস্তবায়িত হয় vfork()
, এটি সাধারণত fork()
শেলগুলি ব্যবহার করে vfork()
- ksh93
সাম্প্রতিক Bourne Shell
এবং csh
।
কেন আপনি এড বাচ্চার exit()
কাছ থেকে কখনই কল করবেন না vfork()
তা exit()
হ'ল কল করার আগে থেকেই অবিচ্ছিন্ন ডেটা থাকলে স্টুডিও ফ্লাশ করে vfork()
। এটি অদ্ভুত ফলাফলের কারণ হতে পারে।
বিটিডাব্লু: posix_spawn()
উপরে প্রয়োগ করা হয়েছে vfork()
, সুতরাং vfork()
ওএস থেকে সরানো হচ্ছে না। উল্লেখ্য করা হয়েছে যে লিনাক্স ব্যবহার করে না vfork()
জন্য posix_spawn()
।
স্ট্যাকের জন্য, কয়েকটি ডকুমেন্টেশন রয়েছে, সোলারিস ম্যান পেজটি এখানে যা বলেছে:
The vfork() and vforkx() functions can normally be used the
same way as fork() and forkx(), respectively. The calling
procedure, however, should not return while running in the
child's context, since the eventual return from vfork() or
vforkx() in the parent would be to a stack frame that no
longer exists.
সুতরাং বাস্তবায়ন এটি পছন্দ করে তা করতে পারে। সোলারিস বাস্তবায়ন ফাংশন কলিংয়ের স্ট্যাক ফ্রেমের জন্য ভাগ করা মেমরি ব্যবহার করে vfork()
। কোনও বাস্তবায়ন পিতামাতার কাছ থেকে স্ট্যাকের পুরানো অংশগুলিতে অ্যাক্সেসের অনুমতি দেয় না।