Professional Documents
Culture Documents
Çağrıları
İşletim Sistemleri Dersi
FORK()
• fork(), herhangi bir parametre almayan bir sistem çağrısıdır.
• Çağrıldığı andan itibaren işletim sistemi tarafından, ana processin bir
kopyası oluşturulur.
• fork() çağrısını yapan process parent, ve bu çağrı ardından oluşan yeni
process ise child olarak adlandırılır.
• fork() çağrısı yapıldığı andan itibaren, oluşan child process, parent’ın
kaldığı yerden devam edecek şekilde bir kopya haline gelir.
FORK()
• fork() çalıştırıldığında aşağıdaki dönüş değerleri ortaya çıkmaktadır:
• fork() çağrısı başarısız olursa dönüş değeri -1 ’dir
• çağrı başarılı olursa;
• parent process için dönüş değeri, yeni oluşan child processin ID’si,
• child process için dönüş değeri 0 ’dır.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
printf("Hello, World \n");
int fork_donus_degeri = fork();
printf("Bye Bye, World \n");
printf("fork donus degeri : %d", fork_donus_degeri);
return 0;
}
• Bir parent process’in, kendi child process’inden önce işleyişini tamamlaması ve kapanması
istenmeyen bir durumdur. Bu nedele böyle durumlardan kaçınmak için parent tarafından
kullanılabilecek bir wait(&donus_degeri) komutu vardır
• Bir parent process’in, kendi child process’inden önce işleyişini
tamamlaması ve kapanması istenmeyen bir durumdur. Bu nedenle
böyle durumlardan kaçınmak için parent tarafından kullanılabilecek
bir wait(&donus_degeri) komutu vardır
wait(&status)
• Üst proses bir alt prosesin sonlanmasını bekleyebilir.
• wait fonksiyonunun prototipi şöyledir:
#include <sys/wait.h>
wait(int *status);
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include "general.h"
int main(void)
{
pid_t pidChild;
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
int fork_donus_degeri = fork();
if (fork_donus_degeri == 0) { // burasi child processte calisir
execl("/bin/ls", "/bin/ls","-la", NULL);
}
return 0;
}
EXEC()
• fork() ile oluşan yeni bir process, parent process ile aynıdır ve kod,
stack ve kullanılan veriler child process içinde yer alır.
• exec*(..) ile bir child processin sahip olduğu kod, veri ve stack
değiştirilebilir.
• Bunun anlamı, child process parent’ın bir kopyası olarak doğmuştur
ancak artık başka bir işlem yürütmektedir ve exec*(..) bitene kadar
child beklemededir.
EXEC()
• fork işlemi sonrasında alt ve üst prosesler aynı program kodunu
çalıştırıyor durumda olurlar. Halbuki pek çok uygulamada programcı
yaratmış olduğu alt prosesin farklı bir program kodunu çalıştırmasını
ister. İşte exec fonksiyonları prosesin başka bir program olarak
çalışmaya devam etmesini sağlamaktadır.
• exec işlemleri sonrasında prosesin id değeri ve kontrol bloğu
değişmez. Prosesin kod, data ve bash alanları çalıştırılabilen
(executable) dosyadan alınarak yüklenir. Proses artık yaşamını başka
bir program olarak sürdürür.
• Tüm exec fonksiyonlarının prototipleri <unistd.h> dosyası içersindedir.
EXEC()
• Exec komutu aldığı parametrelere ve gördüğü işlevlere göre 6 farklı şekilde çalışırlar.
Bunlar ve aldıkları parametreler aşağıdaki gibidir.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void) {
int pid;
pid = getpid();
printf("ilk alınan pid : %d\n", pid);
int fork_donus_degeri = fork();
if (fork_donus_degeri == 0) { // burasi child processte calisir
pid = getpid();
printf("CHILD pid : %d\n", pid);
}
else if (fork_donus_degeri > 0) { // burasi parent processte calisir
pid = getppid();
printf("PARENT pid : %d\n", pid);
}
else if (fork_donus_degeri == -1) {
printf("ERROR : \n"); return 1;
}
pid = getpid(); printf("son alinan pid : %d\n", pid);
return 0;
}
getppid() , getpgrp()
• getppid(), mevcut bir child process’in parent process ID’sini döndürür.
• getpgrp(), bir process grubunun (parent ve child içeren) grup ID’sini
döndürür.
• Bir grubun grup ID’si, o child processleri oluşturan parent process’in
ID’sidir.
Örnekler
• fork.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
pid_t cocuk_pid;
printf(“Ana sürecin pid = %d\n”, (int)getpid() );
cocuk_pid=fork();
if (cocuk_pid!=0){
printf(“burası ana sürectir, süreç id pid=%d\n”,(int)getpid());
printf(“çocuk sürecin idsi pid = %d\n”,(int)cocuk_pid); }
else{
printf(“burası çocuk süreçtir, pid=%d\n”, (int)getpid()); }
return 0;
}
Waitpid()
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void)
{
pid_t pidChild;
}
return 0;
}