Proses Pembuatan & Penghentian

Sampai sekarang kita tahu bahwa setiap kali kita menjalankan program maka sebuah proses dibuat dan akan dihentikan setelah selesainya eksekusi. Bagaimana jika kita perlu membuat proses dalam program dan mungkin ingin menjadwalkan tugas yang berbeda untuk itu. Bisakah ini dicapai? Ya, jelas melalui proses pembuatan. Tentu saja, setelah pekerjaan selesai, itu akan dihentikan secara otomatis atau Anda dapat menghentikannya sesuai kebutuhan.

Pembuatan proses dicapai melalui fork() system call. Proses yang baru dibuat disebut proses anak dan proses yang memulainya (atau proses saat eksekusi dimulai) disebut proses induk. Setelah pemanggilan sistem fork (), sekarang kita memiliki dua proses - proses induk dan anak. Bagaimana cara membedakannya? Sangat sederhana, itu melalui nilai kembali mereka.

Setelah membuat proses anak, mari kita lihat detail panggilan sistem fork ().

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

pid_t fork(void);

Menciptakan proses anak. Setelah panggilan ini, ada dua proses, yang sudah ada disebut proses induk dan yang baru dibuat disebut proses anak.

Panggilan sistem fork () mengembalikan salah satu dari tiga nilai -

  • Nilai negatif untuk menunjukkan kesalahan, yaitu tidak berhasil menciptakan proses anak.

  • Mengembalikan nol untuk proses anak.

  • Mengembalikan nilai positif untuk proses induk. Nilai ini adalah ID proses dari proses anak yang baru dibuat.

Mari kita pertimbangkan program sederhana.

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;
}

Langkah Eksekusi

Kompilasi

gcc basicfork.c -o basicfork

Eksekusi / Output

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

Note- Biasanya setelah panggilan fork (), proses anak dan proses induk akan melakukan tugas yang berbeda. Jika tugas yang sama perlu dijalankan, maka untuk setiap panggilan fork () akan menjalankan 2 daya n kali, di manan adalah berapa kali fork () dipanggil.

Dalam kasus di atas, fork () dipanggil sekali, oleh karena itu outputnya dicetak dua kali (2 daya 1). Jika fork () dipanggil, katakan 3 kali, maka output akan dicetak 8 kali (2 daya 3). Jika dipanggil 5 kali, maka dicetak 32 kali dan seterusnya dan seterusnya.

Setelah melihat fork () membuat proses anak, sekarang saatnya untuk melihat detail proses induk dan anak.

Nama file: 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;
}

Langkah Kompilasi dan Eksekusi

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

Suatu proses dapat berakhir dengan salah satu dari dua cara -

  • Secara tidak normal, terjadi pada pengiriman sinyal tertentu, katakanlah sinyal putus.

  • Biasanya, menggunakan fungsi pustaka _exit () system call (atau _Exit () system call) atau exit ().

Perbedaan antara _exit () dan exit () terutama pada aktivitas pembersihan. Ituexit() melakukan pembersihan sebelum mengembalikan kontrol ke kernel, sedangkan file _exit() (atau _Exit ()) akan mengembalikan kontrol ke kernel segera.

Pertimbangkan program contoh berikut dengan exit ().

Nama file: 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);
}

Langkah Kompilasi dan Eksekusi

Hello, World!
Called cleanup function - exitfunc()

Pertimbangkan program contoh berikut dengan _exit ().

Nama file: 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);
}

Langkah Kompilasi dan Eksekusi

Hello, World!