Gambar Proses Overlay

Asumsikan kita sedang menjalankan program dan ingin menjalankan program lain dari program saat ini. Apakah ini mungkin? Betapa tidak, jika kita menerapkan konsep overlay pada gambar proses. Tidak apa-apa tapi bagaimana dengan program yang sedang berjalan, apakah bisa dijalankan juga. Bagaimana mungkin, karena kami melapisi program saat ini dengan program baru. Apa yang harus saya lakukan, jika saya ingin menjalankan kedua program tanpa kehilangan program yang sedang berjalan, apakah mungkin? Ya, itu mungkin.

Buat proses anak, sehingga kita memiliki proses induk dan proses anak yang baru dibuat. Kami sudah menjalankan program saat ini dalam proses induk, jadi jalankan proses yang baru dibuat pada anak. Dengan cara ini, kita dapat menjalankan program lain dari program saat ini. Tidak hanya satu program tetapi kita dapat menjalankan sejumlah program dari program saat ini dengan membuat banyak proses anak.

Mari kita lihat program berikut ini sebagai contoh.

/ * Nama File: helloworld.c * /

#include<stdio.h>

void main() {
   printf("Hello World\n");
   return;
}

/ * Nama File: execl_test.c * /

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

void main() {
   execl("./helloworld", "./helloworld", (char *)0);
   printf("This wouldn't print\n");
   return;
}

Program di atas akan melapisi gambar proses dari execl_test dengan helloworld. Itulah alasannya, kode gambar proses dari execl_test (printf ()) tidak dijalankan.

Langkah Kompilasi dan Eksekusi

Hello World

Sekarang, kita akan menjalankan dua program berikut dari satu program, yaitu execl_run_two_prgms.c.

  • Program Hello World (helloworld.c)

  • Sedangkan program loop untuk mencetak dari 1 hingga 10 (while_loop.c)

/ * Nama File: while_loop.c * /

/* Prints numbers from 1 to 10 using while loop */
#include<stdio.h>

void main() {
   int value = 1;
   while (value <= 10) {
      printf("%d\t", value);
      value++;
   }
   printf("\n");
   return;
}

Berikut adalah program untuk menjalankan dua program (satu program dari anak dan program lain dari induk).

/ * Nama file: execl_run_two_prgms.c * /

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

void main() {
   int pid;
   pid = fork();
   
   /* Child process */
   if (pid == 0) {
      printf("Child process: Running Hello World Program\n");
      execl("./helloworld", "./helloworld", (char *)0);
      printf("This wouldn't print\n");
   } else { /* Parent process */
      sleep(3);
      printf("Parent process: Running While loop Program\n");
      execl("./while_loop", "./while_loop", (char *)0);
      printf("Won't reach here\n");
   }
   return;
}

Note - Tempatkan panggilan sleep () untuk memastikan proses anak dan induk berjalan secara berurutan (tidak tumpang tindih dengan hasil).

Langkah Kompilasi dan Eksekusi

Child process: Running Hello World Program
This wouldn't print
Parent process: Running While loop Program
Won't reach here

Sekarang kita akan menjalankan dua program dari satu program yaitu, execl_run_two_prgms.c, program yang sama seperti di atas tetapi dengan argumen baris perintah. Jadi, kami menjalankan dua program yaitu, helloworld.c dalam proses anak, dan program while_loop.c dalam proses induk. Ini adalah sebagai berikut -

  • Program Hello World (helloworld.c)

  • Sementara program loop untuk mencetak dari 1 ke num_times_str sesuai argumen baris perintah (while_loop.c)

Program ini secara luas melakukan tindakan berikut -

  • Menciptakan proses anak

  • Proses anak menjalankan program helloworld.c

  • Proses induk menjalankan program while_loop.c meneruskan nilai argumen baris perintah sebagai argumen ke program. Jika argumen baris perintah tidak dilewatkan, maka defaultnya diambil sebagai 10. Jika tidak, ia mengambil nilai argumen yang diberikan. Nilai argumen harus numerik; kode tidak akan divalidasi jika diberikan dalam huruf.

/ * Nama file: execl_run_two_prgms.c * /

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

void main(int argc, char *argv[0]) {
   int pid;
   int err;
   int num_times;
   char num_times_str[5];
   
   /* In no command line arguments are passed, then loop maximum count taken as 10 */
   if (argc == 1) {
      printf("Taken loop maximum as 10\n");
      num_times = 10;
      sprintf(num_times_str, "%d", num_times);
   } else {
      strcpy(num_times_str, argv[1]);
      printf("num_times_str is %s\n", num_times_str);
      pid = fork();
   }
   
   /* Child process */
   if (pid == 0) {
      printf("Child process: Running Hello World Program\n");
      err = execl("./helloworld", "./helloworld", (char *)0);
      printf("Error %d\n", err);
      perror("Execl error: ");
      printf("This wouldn't print\n");
   } else { /* Parent process */
      sleep(3);
      printf("Parent process: Running While loop Program\n");
      execl("./while_loop", "./while_loop", (char *)num_times_str, (char *)0);
      printf("Won't reach here\n");
   }
   return;
}

Berikut ini adalah program helloworld.c yang dipanggil dari proses turunan program, execl_run_two_prgms.c.

/ * Nama File: helloworld.c * /

#include<stdio.h>

void main() {
   printf("Hello World\n");
   return;
}

Berikut ini adalah program while_loop.c yang dipanggil dari proses induk program, execl_run_two_prgms.c. Argumen untuk program ini dilewatkan dari program yang menjalankan ini yaitu, execl_run_two_prgms.c.

/ * Nama file: while_loop.c * /

#include<stdio.h>

void main(int argc, char *argv[]) {
   int start_value = 1;
   int end_value;
   if (argc == 1)
   end_value = 10;
   else
   end_value = atoi(argv[1]);
   printf("Argv[1] is %s\n", argv[1]);
   while (start_value <= end_value) {
      printf("%d\t", start_value);
      start_value++;
   }
   printf("\n");
   return;
}

Langkah Kompilasi dan Eksekusi

Taken loop maximum as 10
num_times_str is 10
Child process: Running Hello World Program
Hello World
Parent process: Running While loop Program
Argv[1] is 10
1 2 3 4 5 6 7 8 9 10
Taken loop maximum as 15
num_times_str is 15
Child process: Running Hello World Program
Hello World
Parent process: Running While loop Program
Argv[1] is 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Sekarang mari kita lihat fungsi perpustakaan terkait gambar overlay.

#include<unistd.h>

int execl(const char *path, const char *arg, ...);

Fungsi ini akan melapisi gambar proses yang sedang berjalan dengan proses baru seperti yang disebutkan dalam argumen, jalur, dan argumen. Jika ada argumen yang perlu diteruskan ke gambar proses baru, itu akan dikirim melalui argumen "arg" dan argumen terakhir harus NULL.

Fungsi ini akan mengembalikan nilai hanya jika terjadi kesalahan. Proses overlay panggilan terkait gambar seperti yang disebutkan di bawah ini -

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);

Panggilan ini akan membahas argumen baris perintah yang lewat (argv []), variabel lingkungan (envp []) dan parameter lainnya.