Proses Lainnya

Selama ini kita telah membahas tentang proses, pembuatannya, proses induk dan anak, dll. Pembahasan tidak akan lengkap tanpa membahas proses terkait lainnya, seperti proses Orphan, proses Zombie dan proses Daemon.

Proses Orphan

Seperti yang ditunjukkan oleh namanya, orphan menyiratkan proses tanpa orang tua. Saat kita menjalankan program atau aplikasi, proses induk untuk aplikasi tersebut adalah shell. Saat kita membuat proses menggunakan fork (), proses yang baru dibuat adalah proses anak dan proses yang membuat anak adalah proses induk. Pada gilirannya, proses induknya adalah shell. Tentu saja, induk dari semua proses adalah proses init (ID Proses → 1).

Di atas adalah skenario biasa, bagaimanapun, apa yang terjadi jika proses induk keluar sebelum proses anak. Hasilnya, proses anak kini menjadi proses yatim piatu. Lalu bagaimana dengan induknya, induk barunya adalah induk dari semua proses, yang tidak lain adalah proses init (ID Proses - 1).

Mari kita coba dan pahami ini menggunakan contoh berikut.

/ * Nama File: orphan_process.c * /

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

int main() {
   int pid;
   system("ps -f");
   pid = fork();
   if (pid == 0) {
      printf("Child: pid is %d and ppid is %d\n",getpid(),getppid());
      sleep(5);
      printf("Child: pid is %d and ppid is %d\n",getpid(),getppid());
      system("ps -f");
   } else {
      printf("Parent: pid is %d and ppid is %d\n",getpid(),getppid());
      sleep(2);
      exit(0);
   }
   return 0;
}

Langkah Kompilasi dan Eksekusi

UID         PID   PPID  C STIME TTY    TIME CMD
4581875  180558      0  0 09:19  ?     00:00:00 sh -c cd /home/cg/root/4581875; 
                                       timeout 10s main
4581875  180564 180558  0 09:19  ?     00:00:00 timeout 10s main
4581875  180565 180564  0 09:19  ?     00:00:00 main
4581875  180566 180565  0 09:19  ?     00:00:00 ps -f
Parent: pid is 180565 and ppid is 180564
UID         PID   PPID  C STIME TTY    TIME CMD
4581875  180567      0  0 09:19  ?     00:00:00 main
4581875  180820 180567  0 09:19  ?     00:00:00 ps -f
Child: pid is 180567 and ppid is 180565
Child: pid is 180567 and ppid is 0

Proses Zombie

Secara sederhana, asumsikan Anda memiliki dua proses, yaitu proses induk dan anak. Ini adalah tanggung jawab proses induk untuk menunggu proses anak dan kemudian membersihkan entri proses anak dari tabel proses. Bagaimana jika proses induk tidak siap menunggu proses anak, dan sementara itu proses anak menyelesaikan tugasnya dan keluar? Sekarang, proses anak akan menjadi proses zombie. Tentu saja, proses zombie dibersihkan setelah proses induk siap.

Mari kita pahami ini dengan bantuan sebuah contoh.

/ * Nama File: zombie_process.c * /

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

int main() {
   int pid;
   pid = fork();
   if (pid == 0) {
      system("ps -f");
      printf("Child: pid is %d and ppid is %d\n",getpid(),getppid());
      exit(0);
   } else {
      printf("Parent: pid is %d and ppid is %d\n",getpid(),getppid());
      sleep(10);
      system("ps aux|grep Z");
   }
   return 0;
}

Langkah Kompilasi dan Eksekusi

UID         PID   PPID  C STIME TTY    TIME CMD
4581875  184946      0  0 09:20  ?     00:00:00 sh -c cd /home/cg/root/4581875; 
                                       timeout 10s main
4581875  184952 184946  0 09:20  ?     00:00:00 timeout 10s main
4581875  184953 184952  0 09:20  ?     00:00:00 main
4581875  184954 184953  0 09:20  ?     00:00:00 main
4581875  184955 184954  0 09:20  ?     00:00:00 ps -f
Child: pid is 184954 and ppid is 184953

Proses Daemon

Secara sederhana, proses yang tidak memiliki shell atau terminal terkait dikenal sebagai proses daemon. Mengapa ini dibutuhkan? Ini adalah proses yang berjalan di latar belakang untuk melakukan tindakan pada interval yang telah ditentukan dan juga merespons peristiwa tertentu. Proses daemon tidak boleh memiliki interaksi pengguna, karena ini berjalan sebagai proses latar belakang.

Proses daemon internal Linux biasanya diakhiri dengan huruf “d” seperti Daemon Kernel (ksoftirqd, kblockd, kswapd, dll.), Printing Daemon (cupsd, lpd, dll.), Daemon Layanan File (smbd, nmbd, dll.) , Daemon basis data Administratif (ypbind, ypserv, dll.), Daemon Email Elektronik (sendmail, popd, smtpd, dll.), Daemon Remote Login dan Eksekusi Perintah (sshd, in.telnetd, dll.), Daemon Booting dan Konfigurasi (dhcpd , udevd, dll.), proses init (init), daemon cron, daemon atd, dll.

Sekarang mari kita lihat cara membuat proses daemon. Berikut langkah-langkahnya -

Step 1- Buat proses anak. Sekarang kita memiliki dua proses - proses induk dan proses anak

Biasanya hirarki prosesnya adalah SHELL → PARENT PROCESS → CHILD PROCESS

Step 2- Hentikan proses induk dengan keluar. Proses anak sekarang menjadi proses yatim piatu dan diambil alih oleh proses init.

Sekarang, hirarki tersebut adalah PROSES INIT → PROSES ANAK

Step 3- Memanggil panggilan sistem setsid () membuat sesi baru, jika proses panggilan bukan pemimpin grup proses. Sekarang proses panggilan menjadi pemimpin grup dari sesi baru. Proses ini akan menjadi satu-satunya proses dalam grup proses baru ini dan dalam sesi baru ini.

Step 4 - Atur ID grup proses dan ID sesi ke PID dari proses panggilan.

Step 5 - Tutup deskriptor file default (input standar, output standar, dan kesalahan standar) dari proses karena terminal dan shell sekarang terputus dari aplikasi.

/ * Nama file: daemon_test.c * /

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>

int main(int argc, char *argv[]) {
   pid_t pid;
   int counter;
   int fd;
   int max_iterations;
   char buffer[100];
   if (argc < 2)
   max_iterations = 5;
   else {
      max_iterations = atoi(argv[1]);
      if ( (max_iterations <= 0) || (max_iterations > 20) )
      max_iterations = 10;
   }
   pid = fork();
   
   // Unable to create child process
   if (pid < 0) {
      perror("fork error\n");
      exit(1);
   }
   
   // Child process
   if (pid == 0) {
      fd = open("/tmp/DAEMON.txt", O_WRONLY|O_CREAT|O_TRUNC, 0644);
      if (fd == -1) {
         perror("daemon txt file open error\n");
         return 1;
      }
      printf("Child: pid is %d and ppid is %d\n", getpid(), getppid());
      printf("\nChild process before becoming session leader\n");
      sprintf(buffer, "ps -ef|grep %s", argv[0]);
      system(buffer);
      setsid();
      printf("\nChild process after becoming session leader\n");
      sprintf(buffer, "ps -ef|grep %s", argv[0]);
      system(buffer);
      close(STDIN_FILENO);
      close(STDOUT_FILENO);
      close(STDERR_FILENO);
   } else {
      printf("Parent: pid is %d and ppid is %d\n", getpid(), getppid());
      printf("Parent: Exiting\n");
      exit(0);
   }
   
   // Executing max_iteration times
   for (counter = 0; counter < max_iterations; counter++) {
      sprintf(buffer, "Daemon process: pid is %d and ppid is %d\n", getpid(), getppid());
      write(fd, buffer, strlen(buffer));
      sleep(2);
   }
   strcpy(buffer, "Done\n");
   write(fd, buffer, strlen(buffer));
   
   // Can't print this as file descriptors are already closed
   printf("DoneDone\n");
   close(fd);
   return 0;
}
Parent: pid is 193524 and ppid is 193523
Parent: Exiting
4581875  193525      0  0 09:23  ?      00:00:00 main
4581875  193526 193525  0 09:23  ?      00:00:00 sh -c ps -ef|grep main
4581875  193528 193526  0 09:23  ?      00:00:00 grep main
4581875  193525      0  0 09:23  ?      00:00:00 main
4581875  193529 193525  0 09:23  ?      00:00:00 sh -c ps -ef|grep main
4581875  193531 193529  0 09:23  ?      00:00:00 grep main