Süreç Oluşturma ve Fesih

Şimdiye kadar, bir programı her çalıştırdığımızda, bir işlemin yaratıldığını ve yürütme tamamlandıktan sonra sonlandırılacağını biliyoruz. Ya program içinde bir süreç oluşturmamız gerekirse ve bunun için farklı bir görev planlamamız istenirse? Bu başarılabilir mi? Evet, tabii ki süreç yaratma yoluyla. Tabii ki, iş bittikten sonra otomatik olarak feshedilir veya gerektiğinde feshedebilirsiniz.

Süreç oluşturma, fork() system call. Yeni oluşturulan sürece alt süreç adı verilir ve onu başlatan süreç (veya yürütme başladığındaki süreç) üst süreç olarak adlandırılır. Fork () sistem çağrısından sonra artık iki işlemimiz var - üst ve alt süreçler. Onları nasıl ayırt edebilirim? Çok basit, dönüş değerleri sayesinde.

Alt süreç oluşturulduktan sonra fork () sistem çağrısı detaylarına bakalım.

#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);

Alt süreci yaratır. Bu çağrıdan sonra iki süreç vardır, mevcut olana üst süreç ve yeni oluşturulan süreç alt süreç olarak adlandırılır.

Fork () sistem çağrısı üç değerden birini döndürür -

  • Bir hatayı, yani alt sürecin yaratılmasında başarısız olduğunu belirtmek için negatif değer.

  • Alt süreç için sıfır döndürür.

  • Üst süreç için pozitif bir değer döndürür. Bu değer, yeni oluşturulan alt sürecin süreç kimliğidir.

Basit bir program düşünelim.

File name: basicfork.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
   fork();
   printf("Called fork() system call\n");
   return 0;
}

Yürütme Adımları

Derleme

gcc basicfork.c -o basicfork

Yürütme / Çıktı

Called fork() system call
Called fork() system call

Note- Genellikle fork () çağrısından sonra, alt süreç ve üst süreç farklı görevleri yerine getirir. Aynı görevin çalıştırılması gerekiyorsa, o zaman her çatal () için çağrı 2 güç n kez çalışır, buradan fork () 'un çağrılma sayısıdır.

Yukarıdaki durumda, çatal () bir kez çağrılır, dolayısıyla çıktı iki kez yazdırılır (2 güç 1). Çatal (), örneğin 3 kez çağrılırsa, çıktı 8 kez yazdırılır (2 güç 3). 5 kez çağrılırsa, 32 kez vb. Yazdırır.

Fork () 'un alt süreci oluşturduğunu gördükten sonra, üst ve alt süreçlerin ayrıntılarını görmenin zamanı geldi.

Dosya adı: pids_after_fork.c

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
   pid_t pid, mypid, myppid;
   pid = getpid();
   printf("Before fork: Process id is %d\n", pid);
   pid = fork();

   if (pid < 0) {
      perror("fork() failure\n");
      return 1;
   }

   // Child process
   if (pid == 0) {
      printf("This is child process\n");
      mypid = getpid();
      myppid = getppid();
      printf("Process id is %d and PPID is %d\n", mypid, myppid);
   } else { // Parent process 
      sleep(2);
      printf("This is parent process\n");
      mypid = getpid();
      myppid = getppid();
      printf("Process id is %d and PPID is %d\n", mypid, myppid);
      printf("Newly created process id or child pid is %d\n", pid);
   }
   return 0;
}

Derleme ve Yürütme Adımları

Before fork: Process id is 166629
This is child process
Process id is 166630 and PPID is 166629
Before fork: Process id is 166629
This is parent process
Process id is 166629 and PPID is 166628
Newly created process id or child pid is 166630

Bir süreç iki yoldan biriyle sona erebilir -

  • Anormal olarak, belirli sinyallerin, mesela sonlandırma sinyalinin iletilmesinde meydana gelir.

  • Normalde, _exit () sistem çağrısı (veya _Exit () sistem çağrısı) veya exit () kitaplık işlevi kullanılır.

_Exit () ve exit () arasındaki fark esas olarak temizleme etkinliğidir. exit() kontrolü çekirdeğe geri döndürmeden önce biraz temizlik yapar, _exit() (veya _Exit ()) denetimi hemen çekirdeğe geri döndürür.

Exit () ile aşağıdaki örnek programı düşünün.

Dosya adı: atexit_sample.c

#include <stdio.h>
#include <stdlib.h>

void exitfunc() {
   printf("Called cleanup function - exitfunc()\n");
   return;
}

int main() {
   atexit(exitfunc);
   printf("Hello, World!\n");
   exit (0);
}

Derleme ve Yürütme Adımları

Hello, World!
Called cleanup function - exitfunc()

_Exit () ile aşağıdaki örnek programı düşünün.

Dosya adı: at_exit_sample.c

#include <stdio.h>
#include <unistd.h>

void exitfunc() {
   printf("Called cleanup function - exitfunc()\n");
   return;
}

int main() {
   atexit(exitfunc);
   printf("Hello, World!\n");
   _exit (0);
}

Derleme ve Yürütme Adımları

Hello, World!