Çatal Sistem Çağrısı Linux

Fork System Call Linux



Çatal sistem çağrısı, yeni bir süreç oluşturmak için kullanılır. Yeni oluşturulan süreç, alt süreçtir. Fork'u çağıran ve yeni bir süreç oluşturan süreç, ana süreçtir. Alt ve üst süreçler aynı anda yürütülür.

Ancak çocuk ve ebeveyn süreçleri farklı bellek alanlarında bulunur. Bu bellek alanları aynı içeriğe sahiptir ve bir işlem tarafından gerçekleştirilen herhangi bir işlem diğer işlemi etkilemeyecektir.







Alt süreçler oluşturulduğunda; şimdi her iki işlem de aynı Program Sayacına (PC) sahip olacak, bu nedenle bu işlemlerin her ikisi de aynı sonraki talimata işaret edecek. Üst süreç tarafından açılan dosyalar, alt süreç için aynı olacaktır.



Alt süreç, ebeveyni ile tamamen aynıdır ancak süreç kimliklerinde farklılık vardır:



  1. Alt sürecin süreç kimliği, diğer tüm mevcut süreçlerin kimliklerinden farklı olan benzersiz bir süreç kimliğidir.
  2. Ebeveyn işlem kimliği, çocuğun ebeveyninin işlem kimliğiyle aynı olacaktır.

Alt Sürecin Özellikleri

Bir alt sürecin sahip olduğu özelliklerden bazıları şunlardır:





  1. CPU sayaçları ve kaynak kullanımları, sıfıra sıfırlamak için başlatılır.
  2. Ana süreç sonlandırıldığında, prctl() içindeki PR_SET_PDEATHSIG özniteliği sıfırlandığından alt süreçler herhangi bir sinyal almaz.
  3. fork()'u çağırmak için kullanılan iş parçacığı, alt işlemi oluşturur. Bu nedenle, alt sürecin adresi ebeveyninkiyle aynı olacaktır.
  4. Üst sürecin dosya tanımlayıcısı, alt süreç tarafından devralınır. Örneğin, dosyanın ofseti veya bayrakların durumu ve G/Ç öznitelikleri, alt ve üst süreçlerin dosya tanımlayıcıları arasında paylaşılacaktır. Bu nedenle, ana sınıfın dosya tanımlayıcısı, alt sınıfın aynı dosya tanımlayıcısına atıfta bulunacaktır.
  5. Üst sürecin açık ileti kuyruğu tanımlayıcıları, alt süreç tarafından devralınır. Örneğin, bir dosya tanıtıcı üst süreçte bir mesaj içeriyorsa, aynı mesaj alt sürecin ilgili dosya tanıtıcısında da bulunacaktır. Yani bu dosya tanımlayıcıların bayrak değerlerinin aynı olduğunu söyleyebiliriz.
  6. Benzer şekilde açık dizin akışları, alt süreçler tarafından devralınır.
  7. Alt sınıfın varsayılan Zamanlayıcı bolluğu değeri, üst sınıfın geçerli zamanlayıcı bolluğu değeriyle aynıdır.

Alt süreç tarafından miras alınmayan özellikler

Bir alt süreç tarafından miras alınmayan özelliklerden bazıları şunlardır:

  1. Hafıza kilitleri
  2. Bir alt sınıfın bekleyen sinyali boş.
  3. İşlemle ilişkili kayıt kilitleri (fcntl())
  4. Asenkron G/Ç işlemleri ve G/Ç içerikleri.
  5. Dizin değişikliği bildirimleri.
  6. alarm(), setitimer() gibi zamanlayıcılar alt sınıf tarafından miras alınmaz.

çatal() C'de

fork()'ta argüman yoktur ve fork()'un dönüş tipi tamsayıdır. fork() kullanıldığında aşağıdaki başlık dosyalarını eklemeniz gerekir:



#Dahil etmek
#Dahil etmek
#Dahil etmek

fork() ile çalışırken, type için kullanılabilir pid_t pid_t'de tanımlandığı gibi işlem kimlikleri için.

Başlık dosyası fork()'un tanımlandığı yerdir, bu yüzden fork()'u kullanmak için programınıza dahil etmeniz gerekir.

Dönüş türü içinde tanımlanır ve fork() çağrısı içinde tanımlanır. Bu nedenle, fork() sistem çağrısını kullanmak için her ikisini de programınıza dahil etmeniz gerekir.

fork() sözdizimi

Linux, Ubuntu'da fork() sistem çağrısının sözdizimi aşağıdaki gibidir:

pid_t çatal(void);

Sözdiziminde dönüş türü pid_t . Alt süreç başarıyla oluşturulduğunda, alt sürecin PID'si üst süreçte döndürülür ve 0, alt işlemin kendisine döndürülür.

Herhangi bir hata varsa, üst sürece -1 döndürülür ve alt süreç oluşturulmaz.

No arguments are passed to fork(). 

Örnek 1: fork() çağırma

Yeni bir alt süreç oluşturmak için fork() sistem çağrısını kullandığımız aşağıdaki örneği göz önünde bulundurun:

KOD:

#Dahil etmek
#Dahil etmek
#Dahil etmek

intana()
{
çatal();
baskı ('Çatal() sistem çağrısını kullanma ');
dönüş 0;
}

ÇIKTI:

fork() sistem çağrısını kullanma
fork() sistem çağrısını kullanma

Bu programda fork() kullandık, bu yeni bir alt süreç yaratacak. Alt süreç oluşturulduğunda, hem ana süreç hem de alt süreç bir sonraki talimata işaret edecektir (aynı Program Sayacı). Bu şekilde kalan komutlar veya C ifadeleri toplam işlem sayısı kadar yürütülür, yani 2nBurada n, fork() sistem çağrılarının sayısıdır.

Yani fork() çağrısı yukarıdaki gibi bir kez kullanıldığında (21= 2) çıktımızı 2 kere almış olacağız.

Burada fork() sistem çağrısı kullanıldığında, iç yapı şöyle görünecektir:

fork() öğesinin 4 kez kullanıldığı aşağıdaki durumu göz önünde bulundurun:

KOD:

#Dahil etmek
#Dahil etmek
#Dahil etmek

intana()
{
çatal();
çatal();
çatal();
çatal();
baskı ('Çatal() sistem çağrısı kullanma');
dönüş 0;
}

Çıktı:

Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call 

Şimdi oluşturulan toplam işlem sayısı 24= 16 ve print ifademizi 16 kez çalıştırdık.

Örnek 2: fork()'un başarılı olup olmadığını test etme

Aşağıdaki örnekte, fork() tarafından döndürülen değeri (int) test etmek için karar verme yapısını kullandık. Ve ilgili mesajlar görüntülenir:

KOD:

#Dahil etmek
#Dahil etmek
#Dahil etmek

intana()
{
pid_t p;
P=çatal();
Eğer(P== -1)
{
baskı ('fork() çağrılırken bir hata oluştu');
}
Eğer(P==0)
{
baskı ('Çocuk sürecindeyiz');
}
Başka
{
baskı ('Aile sürecindeyiz');
}
dönüş 0;
}

ÇIKTI:

Ebeveyn sürecindeyiz
Çocuk sürecindeyiz

Yukarıdaki örnekte, fork()'un dönüş değerini saklayacak olan pid_t tipini kullandık. fork() hatta çağrılır:

P=çatal();

Böylece fork() tarafından döndürülen tamsayı değeri p'de saklanır ve ardından fork() çağrımızın başarılı olup olmadığını kontrol etmek için p karşılaştırılır.

fork() çağrısı kullanıldığında ve çocuk başarılı bir şekilde oluşturulduğunda, alt sürecin kimliği üst sürece döndürülecek ve alt sürece 0 döndürülecektir. Üst süreçteki alt sürecin kimliği, alt sürecin kimliği ile aynı olmayacaktır. Alt sürecin kendisinde alt sürecin kimliği. Alt süreçte alt sürecin kimliği 0 olacaktır.

Bu öğretici ile linux'ta çatal sistem çağrısına nasıl başlayacağınızı görebilirsiniz.