Google'da bu dördü arasındaki farkı bulmak istiyordum ve bu konuda çok fazla bilgi olmasını bekliyordum, ancak dört çağrı arasında gerçekten sağlam bir karşılaştırma yoktu.
Bu sistem çağrıları arasındaki farklara bir bakışta bir tür temel bakışta derlemeye çalıştım ve işte ne aldım. Tüm bu bilgiler doğru mu / önemli bir şey eksik mi?
Fork
: Çatal çağrısı temel olarak mevcut işlemin neredeyse her şekilde aynı olanını yapar (her şey kopyalanmaz, örneğin bazı uygulamalarda kaynak sınırları, ancak fikir mümkün olduğunca yakın bir kopya oluşturmaktır).
Yeni işlem (alt öğe) farklı bir işlem kimliği (PID) alır ve eski işlemin (üst öğenin) PID'sini üst PID'si (PPID) olarak alır. İki işlem artık tam olarak aynı kodu çalıştırdığından, hangisinin çatalın dönüş koduyla hangisinin olduğunu 0 söyleyebilir - çocuk 0 alır, ebeveyn çocuğun PID'sini alır. Tabii ki, çatal çağrısının işe yaradığını varsayarsak, hepsi değilse, hiçbir çocuk oluşturulmaz ve ebeveyn bir hata kodu alır.
Vfork
: Vfork ve fork arasındaki temel fark, vfork () ile yeni bir işlem oluşturulduğunda, üst işlemin geçici olarak askıya alınması ve alt işlemin üst öğenin adres alanını ödünç almasıdır. Bu garip durum, alt süreç ya da üst süreç devam edinceye kadar execve () çağrılarına kadar devam eder.
Bu, vfork () işlevinin alt işleminin, üst işlemin değişkenlerini beklenmedik biçimde değiştirmemesi için dikkatli olması gerektiği anlamına gelir. Özellikle, alt işlem vfork () çağrısını içeren işlevden geri dönmemeli ve exit () çağrılmamalıdır (çıkması gerekiyorsa _exit () kullanmalıdır; aslında, bu çocuk için de geçerlidir normal çatalın ()).
Exec :
Exec çağrısı temelde mevcut sürecin tamamını yeni bir programla değiştirmenin bir yoludur. Programı geçerli işlem alanına yükler ve giriş noktasından çalıştırır. exec () işlevi, işlemin işaret ettiği bir yürütülebilir dosyayla değiştirir. Bir exec () hatası olmadıkça, kontrol hiçbir zaman orijinal programa geri dönmez.
Clone :
Klon, çatal olarak yeni bir süreç yaratır. Çataldan farklı olarak, bu çağrılar alt işlemin yürütme bağlamının bir bölümünü bellek alanı, dosya tanımlayıcıları tablosu ve sinyal işleyicileri tablosu gibi çağrı işlemiyle paylaşmasına izin verir.
Alt işlem klonla oluşturulduğunda, fn (arg) işlev uygulamasını yürütür. (Bu, yürütmenin çocukta orijinal çatal çağrısı noktasından devam ettiği çataldan farklıdır.) Fn argümanı, yürütme başlangıcında alt işlem tarafından çağrılan bir işleve işaret eder. Arg argümanı fn işlevine iletilir.
Fn (arg) işlevi uygulaması geri döndüğünde, alt işlem sonlandırılır. Fn tarafından döndürülen tam sayı, alt işlemin çıkış kodudur. Alt süreç ayrıca exit (2) öğesini çağırarak veya ölümcül bir sinyal aldıktan sonra açıkça sonlanabilir.
Bilgi Alındı Formu:
- Çatal ve exec arasındaki farklar
- http://www.allinterview.com/showanswers/59616.html
- http://www.unixguide.net/unix/programming/1.1.2.shtml
- http://linux.about.com/library/cmd/blcmdl2_clone.htm
Bunu okumak için zaman ayırdığınız için teşekkür ederiz! :)
fork()
, Linux'ta olduğu ve muhtemelen tüm BSD'lerde) ebeveyninin adres alanını ödünç alıyor. Her şey o çağırarak yanında yapar execve()
ya _exit()
, ebeveyn kadar karışıklık için büyük bir potansiyele sahiptir. Özellikle, işleyicileri ve diğer "sonlandırıcıları" exit()
çağırır atexit()
, örneğin: stdio akışlarını temizler. Bir vfork()
çocuktan dönmek, potansiyel olarak (önceki ile aynı uyarı) ebeveynin yığınını kirletir.
fork
sistem çağrısını çağıran evre mi?