Bindirme İşlem Görüntüsü
Bir program çalıştırdığımızı ve mevcut programdan başka bir program çalıştırmak istediğimizi varsayalım. Mümkün mü? Süreç görüntüsünün üzerine yerleştirme konseptini uygularsak neden olmasın? Sorun değil ama mevcut çalışan program ne olacak, o da çalıştırılabilir. Mevcut programı yeni programla kapladığımız için bu nasıl mümkün olabilir? Ne yapmalıyım, iki programı mevcut çalışan programı kaybetmeden çalıştırmak istersem mümkün mü? Evet mümkün.
Bir üst süreç ve yeni oluşturulmuş bir alt süreç oluşturmamız için bir alt süreç oluşturun. Zaten mevcut programı ana süreçte çalıştırıyoruz, bu nedenle yeni oluşturulan süreci çocukta çalıştırın. Bu şekilde mevcut programdan başka bir programı çalıştırabiliriz. Sadece tek bir program değil, bu kadar çok sayıda çocuk süreç oluşturarak mevcut programdan istediğiniz sayıda programı çalıştırabiliriz.
Aşağıdaki programı örnek olarak ele alalım.
/ * Dosya Adı: helloworld.c * /
#include<stdio.h>
void main() {
printf("Hello World\n");
return;
}
/ * Dosya Adı: execl_test.c * /
#include<stdio.h>
#include<unistd.h>
void main() {
execl("./helloworld", "./helloworld", (char *)0);
printf("This wouldn't print\n");
return;
}
Yukarıdaki program, execl_test'in işlem görüntüsünü helloworld ile kaplayacaktır. Execl_test (printf ()) işlem görüntü kodu çalıştırılmamasının nedeni budur.
Derleme ve Yürütme Adımları
Hello World
Şimdi, aşağıdaki iki programı bir programdan çalıştıracağız, yani execl_run_two_prgms.c.
Merhaba Dünya programı (helloworld.c)
While döngü programı 1'den 10'a yazdırmak için (while_loop.c)
/ * Dosya Adı: 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;
}
Aşağıda, iki program çalıştırma programı verilmiştir (bir program çocuktan ve diğer program ebeveynden).
/ * Dosya adı: 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 - Alt ve üst işlemlerin sıralı olarak çalıştığından emin olmak için uyku () çağrısı yapın (sonuçla örtüşmeyin).
Derleme ve Yürütme Adımları
Child process: Running Hello World Program
This wouldn't print
Parent process: Running While loop Program
Won't reach here
Şimdi bir programdan iki program çalıştıracağız, yani execl_run_two_prgms.c, yukarıdaki ile aynı program ama komut satırı argümanları ile. Yani, çocuk süreçte helloworld.c ve üst süreçte while_loop.c olmak üzere iki program çalıştırıyoruz. Bu aşağıdaki gibidir -
Merhaba Dünya programı (helloworld.c)
While döngü programı komut satırı argümanlarına göre 1'den num_times_str'e yazdırmak için (while_loop.c)
Bu program genel olarak aşağıdaki eylemleri gerçekleştirir -
Bir çocuk süreç yaratır
Çocuk süreç helloworld.c programını yürütür
Ana süreç, programa bir argüman olarak komut satırı argüman değerini ileten while_loop.c programını çalıştırır. Komut satırı argümanları iletilmezse, varsayılan değer 10 olarak alınır. Aksi takdirde, verilen argüman değerini alır. Bağımsız değişken değeri sayısal olmalıdır; alfabe halinde verilirse kod doğrulanmaz.
/ * Dosya adı: 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;
}
Aşağıda, programın alt süreci olan execl_run_two_prgms.c'den çağrılan helloworld.c programı bulunmaktadır.
/ * Dosya Adı: helloworld.c * /
#include<stdio.h>
void main() {
printf("Hello World\n");
return;
}
Aşağıda, programın üst sürecinden çağrılan while_loop.c programı, execl_run_two_prgms.c bulunmaktadır. Bu programın argümanı bunu çalıştıran programdan geçirilir, yani execl_run_two_prgms.c.
/ * Dosya adı: 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;
}
Derleme ve Yürütme Adımları
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
Şimdi bindirme görüntüsü ile ilgili kütüphane işlevlerini görelim.
#include<unistd.h>
int execl(const char *path, const char *arg, ...);
Bu işlev argümanlarda, yol ve argümanlarda belirtildiği gibi mevcut çalışan süreç görüntüsünü yeni işlemle kaplar. Herhangi bir bağımsız değişkenin yeni bir süreç görüntüsüne iletilmesi gerekiyorsa, bu "bağımsız değişken" bağımsız değişkenleri aracılığıyla gönderilir ve son bağımsız değişken NULL olmalıdır.
Bu işlev, yalnızca hata durumunda bir değer döndürür. Görüntüyle ilgili aramaların üst üste gelme süreci aşağıda belirtildiği gibidir -
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[]);
Bu çağrılar, komut satırı bağımsız değişkenlerini (argv []), ortam değişkenlerini (envp []) ve diğer parametreleri iletir.