কার্নেলের কোন ফাইলটি কাঁটাচামচ (), ভিফোর্ক ()… সিস_ক্লোন () সিস্টেম কল ব্যবহার করতে নির্দিষ্ট করে


9

সিস্টেম কলগুলির সন্ধানের জন্য যখন ltrace ব্যবহার করা হয়, তখন আমি দেখতে পেতাম যে কাঁটাচামচ (sys_fork () এর পরিবর্তে sys_clone () ব্যবহার করে। তবে আমি লিনাক্স উত্সটি খুঁজে পাইনি যেখানে এটি সংজ্ঞায়িত হয়েছে।

আমার প্রোগ্রাম

#include<stdio.h>
main()
{
        int pid,i=0,j=0;
        pid=fork();
        if(pid==0)
                printf("\nI am child\n");
        else
                printf("\nI am parent\n");

}

এবং ltrace আউটপুট হয়

SYS_brk(NULL)                                                                               = 0x019d0000
SYS_access("/etc/ld.so.nohwcap", 00)                                                        = -2
SYS_mmap(0, 8192, 3, 34, 0xffffffff)                                                        = 0x7fe3cf84f000
SYS_access("/etc/ld.so.preload", 04)                                                        = -2
SYS_open("/etc/ld.so.cache", 0, 01)                                                         = 3
SYS_fstat(3, 0x7fff47007890)                                                                = 0
SYS_mmap(0, 103967, 1, 2, 3)                                                                = 0x7fe3cf835000
SYS_close(3)                                                                                = 0
SYS_access("/etc/ld.so.nohwcap", 00)                                                        = -2
SYS_open("/lib/x86_64-linux-gnu/libc.so.6", 0, 00)                                          = 3
SYS_read(3, "\177ELF\002\001\001", 832)                                                     = 832
SYS_fstat(3, 0x7fff470078e0)                                                                = 0
SYS_mmap(0, 0x389858, 5, 2050, 3)                                                           = 0x7fe3cf2a8000
SYS_mprotect(0x7fe3cf428000, 2097152, 0)                                                    = 0
SYS_mmap(0x7fe3cf628000, 20480, 3, 2066, 3)                                                 = 0x7fe3cf628000
SYS_mmap(0x7fe3cf62d000, 18520, 3, 50, 0xffffffff)                                          = 0x7fe3cf62d000
SYS_close(3)                                                                                = 0
SYS_mmap(0, 4096, 3, 34, 0xffffffff)                                                        = 0x7fe3cf834000
SYS_mmap(0, 4096, 3, 34, 0xffffffff)                                                        = 0x7fe3cf833000
SYS_mmap(0, 4096, 3, 34, 0xffffffff)                                                        = 0x7fe3cf832000
SYS_arch_prctl(4098, 0x7fe3cf833700, 0x7fe3cf832000, 34, 0xffffffff)                        = 0
SYS_mprotect(0x7fe3cf628000, 16384, 1)                                                      = 0
SYS_mprotect(0x7fe3cf851000, 4096, 1)                                                       = 0
SYS_munmap(0x7fe3cf835000, 103967)                                                          = 0
__libc_start_main(0x40054c, 1, 0x7fff47008298, 0x4005a0, 0x400590 <unfinished ...>
fork( <unfinished ...>
SYS_clone(0x1200011, 0, 0, 0x7fe3cf8339d0, 0)                                               = 5967
<... fork resumed> )                                                                        = 5967
puts("\nI am parent" <unfinished ...>
SYS_fstat(1, 0x7fff47008060)                                                                = 0
SYS_mmap(0, 4096, 3, 34, 0xffffffff
)                                                        = 0x7fe3cf84e000
I am child
SYS_write(1, "\n", 1
)                                                                       = 1
SYS_write(1, "I am parent\n", 12)                                                           = -512
--- SIGCHLD (Child exited) ---
SYS_write(1, "I am parent\n", 12I am parent
)                                                           = 12
<... puts resumed> )                                                                        = 13
SYS_exit_group(13 <no return ...>
+++ exited (status 13) +++

এটি আপনার জন্য সহায়ক হতে পারে: lxr.linux.no/linux+v3.10.9
পুনরায়

@ মুরো.স্টেস্টলার আমি এটিকে lxr
उपयोगकर्ता 3539

আপনি কি 1700 লাইনের চারপাশে git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/… বলতে চান ? আপনি কি খুঁজে প্রত্যাশী ছিল?
এমএসডব্লিউ

উত্তর:


29

গ্লিবিতে থাকা fork()এবং vfork()মোড়কগুলি clone()সিস্টেম কলের মাধ্যমে প্রয়োগ করা হয় । fork()এবং এর মধ্যে সম্পর্কটি আরও ভালভাবে বুঝতে clone(), আমাদের লিনাক্সে প্রক্রিয়া এবং থ্রেডের মধ্যে সম্পর্ক বিবেচনা করতে হবে।

প্রথাগতভাবে, fork()সব পিতা বা মাতা প্রক্রিয়া দ্বারা মালিকানাধীন সম্পদগুলি dublicate ও শিশু প্রক্রিয়া কপি ধার্য হবে। এই পদ্ধতির যথেষ্ট ওভারহেড অনুভূত হয়, যা শিশু যদি তাত্ক্ষণিকভাবে কল করে তবে এগুলি সমস্ত কিছুই নয় exec()। লিনাক্স সালে fork()সদ্ব্যবহার কপি-অন-লেখ বিলম্বের পৃষ্ঠা বা পুরাপুরি ডেটা আছে যা পিতা বা মাতা এবং শিশু প্রক্রিয়াগুলির মধ্যে ভাগ করা যেতে পারে অনুলিপি এড়ানো। সুতরাং, স্বাভাবিকের সময় একমাত্র ওভারহেডটি fork()হয় পিতামাতার পৃষ্ঠার সারণির অনুলিপি এবং সন্তানের জন্য একটি অনন্য প্রক্রিয়া বিবরণকারী কাঠামোর কার্যভার task_struct

লিনাক্স থ্রেডগুলিতেও ব্যতিক্রমী দৃষ্টিভঙ্গি গ্রহণ করে। লিনাক্সে, থ্রেডগুলি কেবলমাত্র সাধারণ প্রক্রিয়া যা অন্য প্রক্রিয়াগুলির সাথে কিছু সংস্থান ভাগ করে নিতে ঘটে। এটি উইন্ডোজ বা সোলারিসের মতো অন্যান্য অপারেটিং সিস্টেমের তুলনায় থ্রেডগুলির ক্ষেত্রে একেবারে আলাদা পদ্ধতি, যেখানে প্রক্রিয়া এবং থ্রেডগুলি সম্পূর্ণ ভিন্ন ধরণের জন্তু। লিনাক্সে, প্রতিটি থ্রেডের নিজস্ব একটি সাধারণ task_structথাকে যা ঠিকঠাকভাবে এমনভাবে সেটআপ হয়ে যায় যাতে এটি প্যারেন্ট প্রক্রিয়াটির সাথে নির্দিষ্ট সংস্থান যেমন একটি ঠিকানা স্পেস ভাগ করে দেয়।

flagsএর প্যারামিটার clone()সিস্টেম কল পতাকা, যা সম্পদ ইঙ্গিত, যদি থাকে, পিতা বা মাতা এবং শিশু প্রসেস ভাগ করা উচিত একটি সেট অন্তর্ভুক্ত করা হয়েছে। প্রক্রিয়া এবং থ্রেড উভয় মাধ্যমে তৈরি করা হয় clone(), শুধুমাত্র পার্থক্য হ'ল পতাকাগুলির সেট যা প্রেরণ করা হয় clone()

একটি সাধারণ fork()হিসাবে প্রয়োগ করা যেতে পারে:

clone(SIGCHLD, 0);

এটি এমন একটি টাস্ক তৈরি করে যা তার পিতামাতার সাথে কোনও সংস্থান ভাগ করে না এবং SIGCHLDপ্রস্থান করার সময় পিতামাতার কাছে সমাপ্তির সংকেত প্রেরণে সেট করা হয় ।

বিপরীতে, কোনও কাজ যা ঠিকানা স্থান, ফাইল সিস্টেম সংস্থানগুলি, ফাইল বর্ণনাকারী এবং সংকেত হ্যান্ডলারগুলি পিতামাতার সাথে ভাগ করে, অন্য কথায় একটি থ্রেড তৈরি করা যেতে পারে:

clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);

vfork()পরিবর্তে একটি পৃথক CLONE_VFORKপতাকা মাধ্যমে প্রয়োগ করা হয় , যা সন্তানের প্রক্রিয়াটি সিগন্যালের মাধ্যমে না জাগানো পর্যন্ত পিতামাতার প্রক্রিয়াটিকে ঘুমিয়ে দেবে। শিশু কল না হওয়া exec()বা প্রস্থান না হওয়া অবধি পিতামাতার নামস্থানে মৃত্যুদন্ডের একমাত্র থ্রেড হবে । সন্তানের স্মৃতিতে লেখার অনুমতি নেই। সম্পর্কিত clone()কল নিম্নলিখিত হিসাবে হতে পারে:

clone(CLONE_VFORK | CLONE_VM | SIGCHLD, 0)

বাস্তবায়ন sys_clone()আর্কিটেকচার নির্দিষ্ট, কিন্তু কাজ সর্বাধিক মধ্যে do_fork()সংজ্ঞায়িত হয় kernel/fork.c। এই ফাংশনটি স্ট্যাটিককে কল করে clone_process(), যা পিতামাতার অনুলিপি হিসাবে একটি নতুন প্রক্রিয়া তৈরি করে, তবে এটি এখনও শুরু করে না। clone_process()কপি রেজিস্টার, নির্ধারণ নতুন টাস্ক করার জন্য একটি PID,, এবং হয় dublicates বা শেয়ারের হিসাবে ক্লোন দ্বারা নির্দিষ্ট প্রক্রিয়া পরিবেশের উপযুক্ত অংশের flags। যখন clone_process()ফিরে আসে, do_clone()সদ্য তৈরি হওয়া প্রক্রিয়াটি জাগ্রত করবে এবং এটি চালানোর জন্য সময় নির্ধারণ করবে।


2
clone()থ্রেড এবং কাঁটাচামচ সম্পর্কিত তাত্পর্য সম্পর্কে +1 চমৎকার ব্যাখ্যা ।
স্বর্ণলোক

1
আমার সমস্ত সন্দেহগুলি পরিষ্কার করা হয়েছে
ব্যবহারকারীর 3539

2

লিনাক্সের অধীনে কার্নেল সিস্টেম কলগুলিতে ইউজারল্যান্ড সিস্টেম কল ফাংশন অনুবাদ করার জন্য দায়বদ্ধ উপাদানটি হল libc। জিএলআইবিসি-তে, এনপিটিএল লাইব্রেরি এটি clone(2)সিস্টেম কলে পুনর্নির্দেশ করে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.