fork() কী?
os.fork() করেন্ট প্রসেসের একটি কপি (চাইল্ড প্রসেস) তৈরি করে। यুনিক্স/লিনাক্স-এ প্রসেস তৈরির মূল পদ্ধতি। উইন্ডোজে সাপোর্ট নেই (পাইথন ৩.৮+ এ os.fork() উইন্ডোজেও কাজ করে কিছু শর্তে, কিন্তু সাধারণত নন-পোর্টেবল)।
রিটার্ন ভ্যালু
- > 0 (পারেন্ট-এ): চাইল্ড প্রসেসের PID
- = 0 (চাইল্ড-এ): ০
- < 0: এরর
উদাহরণ: os.fork()
import os
def parent_child():
pid = os.fork()
if pid > 0:
# প্যারেন্ট প্রসেস
print(f"Parent process: PID = {os.getpid()}, Child PID = {pid}")
elif pid == 0:
# চাইল্ড প্রসেস
print(f"Child process: PID = {os.getpid()}, Parent PID = {os.getppid()}")
else:
print("Fork failed!")
if __name__ == "__main__":
parent_child()
আউটপুট নমুনা
Parent process: PID = 8023, Child PID = 8024 Child process: PID = 8024, Parent PID = 8023
pty মডিউল (Pseudo-Terminal)
pty.fork() একটি প্রসেস তৈরি করে যার একটি পseudo-টার্মিনাল থাকে। ইন্টারঅ্যাক্টিভ প্রোগ্রাম চালাতে ব্যবহৃত হয়।
import pty, os
pid, fd = pty.fork()
if pid == 0:
# চাইল্ড: কমান্ড এক্সিকিউট
os.execvp('ls', ['ls', '-la'])
else:
# প্যারেন্ট: fd দিয়ে I/O করতে পারে
print(f"Child PID: {pid}")
os.waitpid(pid, 0)
গুরুত্বপূর্ণ নোট
- Windows-এ fork() নেই। ক্রস-প্ল্যাটফর্মের জন্য
multiprocessing.Processব্যবহার করুন। - ফর্ক করার পর
exec()ফ্যামিলি (execvp,execlইত্যাদি) কল করে নতুন প্রোগ্রাম চালানো হয়। - চাইল্ড প্রসেস প্যারেন্টের মেমরি কপি পায় (Copy-on-Write)।
- জোম্বি প্রসেস এড়াতে প্যারেন্ট
wait()বাwaitpid()কল করবেন।
multiprocessing এ কনভার্সন
# fork()-এর বদলে (ক্রস-প্ল্যাটফর্ম)
from multiprocessing import Process
def child():
print(f"Child PID: {os.getpid()}")
if __name__ == '__main__':
p = Process(target=child)
p.start()
p.join()