<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta name="generator" content="HTML Tidy, see www.w3.org">
    <!-- this stylesheet will later on be added by lfparser automatically: -->
<style type="text/css">
<!--
  pre { font-family:monospace,Courier }
  p.code { width:80%; alignment:center; background-color:#aedbe8; 
     border-style:none; border-width:medium; border-color:#aedbe8; 
     padding:0.1cm ; text-align:left }
-->
</style>

    <title></title>
  </head>

<BODY>
<H1>E�zamanl� programlama - Kavramlar ve i�lemlere giri�</H1>

<H4>ArticleCategory:</H4> 
SoftwareDevelopment

<H4>AuthorImage:</H4>
<img src="../../common/images/LeonardoGiordani.jpg" width="85" height="109" alt="[Leonardo]">


<H4>TranslationInfo:</H4>

<p>original in it: <a href="mailto:leo.giordani(at)libero.it">Leonardo Giordani</a>
<p>it to en: <a href="mailto:leo.giordani(at)libero.it">Leonardo Giordani</a>
<p>en to tr <a href="mailto:erdal(at)linuxfocus.org">Erdal Mutlu</a>

<H4>AboutTheAuthor:</H4>
<P> Yazar, Milan Politecnico �niversitesinin Telekomunikasyon M�hendisli�inde
okumakta ve bilgisayar a�lar� y�neticisi olarak �al��maktad�r. Daha �ok 
Assemble ve C/C++ olmak �zere, programlamaya ilgi duymaktad�r. 1999 y�l�ndan beri
neredeyse tamamen Linux/Unix ile �al��maktad�r.

<H4>Abstract:</H4>
Bu yaz� dizisinin amac�, okuyculara Linux i�letim sistemindeki
�oklui�lem (multitasking) ve uygulamas�na giri� olu�turmaktad�r.
�oklui�lem teorisinin temellerinden ba�layarak, 
i�lemler veya s�re�ler (processes) aras�ndaki haberle�meyi, basit ve bir o kadar
da etkili bir protokol kullanarak g�steren,
bir program yazarak konuyu tamamlayaca��z.
Yaz�y� anlayabilmek i�in gerekli �nbilgiler �unlard�r:
<ul>
<li>Kabuk ortam� hakk�nda temel bilgi.
<li>C programlama dili hakk�nda temel bilgi (Yaz�m kullar�, d�ng�ler, k�t�phaneler vs.).
</ul>
Man sayfalar�na olan referanslar, komutlar�n hemen ard�ndan 
parantez i�inde verilmi�tir. Glibc fonksiyonlar�n t�m�, info sayfalar�nda
belgelendirilmi�tir (info Libc veya konqueror'da info:/libc/Top).

<H4>ArticleIllustration:</H4>
<img src="../../common/images/illustration272.jpg" width="300" height="180" alt="[run in paralell]">


<H4>ArticleBody:</H4>

<H3>Giri�</H3>
�e�itli programlar� par�a par�a (interlaced)
�al��t�rarak, sistem kaynaklar�n� daha iyi bir �ekilde
kullan�lmas�n� sa�layan bir y�ntem olan �oklui�lem
kavram�n�n getirilmesi, i�letim sistemleri tarihinde
bir d�n�m noktas� olmu�tur. S�zgelimi, kelime i�lemci, ses �alar,
yaz�c� kuyrugu, sanaldoku gezgini ve daha fazla uygulaman�n
�al��t��� bir bilgisayar� d���nelim. Bu y�ntem modern i�letim
sistemleri i�in �nemli bir kavramd�r.
�leride de ke�fedece�imiz gibi, yukar�da sayd���m�z uygulamalar,
her ne kadar g�rsel uygulamalar olsalar da,
bilgisayar�n�zda �al��an programlar�n k���k bir k�sm�d�r. 
 
<H3>��lem kavram�</H3>

<p>
Birden fazla program� ayn� anda �al��t�rabilmek i�in
i�letim sisteminin yapmas� gereken karma��k i�lemlere
gereksinimi vard�r. �al��an programlar aras�nda olu�abilecek 
kar���kl��� �nlemek i�in, programlar�n �al��t�r�lmalar� ile
ilgili gerekli t�m bilginin bir yerde saklanmas� ka��n�lmazd�r. 

<p>
Linux bilgisayar�m�zda ne olup bitti�ine ge�meden �nce biraz genel 
k�lt�r bilgisi verelim: �al��an bir <b>PROGRAM</b> verildi�inde,
program� olu�turan komutlar k�mesine <b>CODE</b>(Program kodu), program verilerin
bilgisayar belle�inde kaplad��� alana <b>MEMORY SPACE</b>(Bellek alan�) 
ve mikroi�lemcinin
parametre de�erleri, �e�itli bayrak de�erleri veya program sayac�na 
(Bir sonra �al��t�r�lacak olan komutun adres de�eri.), <b>PROCESSOR STATUS</b>
(�lemci durumu) denilmektedir.

<p>
<b>RUNNING PROGRAM</b> (�al��an program) kavram�n�, Program kodu, 
Bellek alan� ve ��lemci durumu nesnelerinden olu�an bir b�t�n
olarak tan�ml�yoruz. E�er, herhangi bir zaman diliminde, bu bilgiyi
kaydedip, ba�ka program�n bilgileri ile de�i�tirdi�imizde, kaydetti�imiz
programa tekrar d�n�ld���nde, program kald��� yerden �al��mas�na devam
edebilmedir: Bu �al��ma y�ntemi birden fazla program�n ayn� anda ve birbirleri
ile �ak��madan �al���yor gibi g�r�nmesini sa�lamaktad�r.
<b>PROCESS</b> veya <b>TASK</b> (S�re� veya i�lem) kelimesi b�yle �al��an
bir program� tan�mlamak i�in kullan�lmaktad�r.
<p>
�imdi, yaz�n�n ba��nda s�z�n� etti�imiz Linux bilgisayar�nda
neler oldu�una bir g�z atal�m. Herhangi bir anda, bilgisayarda 
sadece bir adet i�lem �al��t�r�labilmektedir (Sistemde sadece bir 
mikroi�lemci vard�r ve bu i�lemci ayn� anda iki i�lemi yerine
getirememektedir.). �al��an program�n da saedece belli bir k�sm�
i�lem g�rmektedir. Belli bir s�re sonra, buna QUANTUM denmektedir,
�al��an i�lem durdurulmakta, daha sonra kald��� yerden devam etmek �zere
i�lem ile ilgili bilgiler bir yerde ve beklemekte olan ba�ka bir i�lemin 
bilgileri ile de�i�tirilerek, bir quantum s�resi boyunca �al��t�r�lmaktad�r.
Ayn� anda �al���yor gibi izlenim veren i�lemler b�ylece �al��t�r�lmaktad�r.
Buna biz multitasking (�oklui�lem) diyoruz. 

<p>
Daha �nce de s�yledi�im gibi, �oklui�lem kullan�l�yor olmas� baz�
sorunlar� da beraberinde getirmektedir. S�zgelimi,
kuyrukta bekleyen i�lemlerim y�netimi (SCHEDULING). Herneyse,
bunlar i�letim sisteminin yap�s� ile ilgili konular. Bu belkide
ba�ka bir yaz� yaz�m� i�in uygun bir konu olabilir. Linux 
�ekirde�ini tan�t�c� bir yaz� yaz�labilir. 

<H3>Linux ve Unix'teki i�lemler</H3>

<p>
Bilgisayar�m�zda �al��an i�lemler ile ilgili biraz bilgi edinelim.
Bu bilgiyi sa�layan komutun ad� <b>ps(1)</b> dir ve "process status"
(i�lem durumu) s�zc�klerin k�saltmas�d�r.
Bir terminal a��p, ps komutunu �al��tr�rsan�z, a�a��dakine
benzer bir ��kt� elde edersiniz.

<pre>
  PID TTY          TIME CMD
 2241 ttyp4    00:00:00 bash
 2346 ttyp4    00:00:00 ps
</pre>

<p>
Daha �nce de belirti�im gibi bu ��kt� tam de�il, ancak �imdilik buna
odaklanal�m: ps komutu bize terminalde �al��an i�lemlerin listesini
vermektedir. ��kt�n�n son s�t�nunda, i�lemin �al��t�r�ld��� komutun
ad�n� g�rmekteyiz. S�zgelimi, Mozilla sanaldoku gezgini i�in mozilla,
GNU derleyicisi i�in gcc vs. �al��makta olan i�lemlerin listesi ekranda
g�sterilirken ps i�lemi de �al��t���ndan, kendisin de bu listede g�r�nmesi
�ok do�al. Listede g�r�nen di�er i�lemler �unlard�r: Benim terminalde 
�al��an Bourne Again Shell (kabuk ortam�) dir. 

<p>
Bir an i�in TIME ve TTY bilgilerini g�zard� edelim ve PID (i�lem numaras�)
bilgisine bakal�m. Pid, her i�leme tekil olarak verilen, s�f�rdan farkl�  
pozitif bir say�d�r. ��lem sona erdi�inde, i�lem numaras� tekrar 
kullan�labilir. Ancak, i�lem �al��t��� s�rece, bu numaran�n deyi�meyece�i
garantilenmektedir. Sizin ps komutundan elde edece�iniz ��kt�,
yukar�dakinden farkl� olacakt�r. S�ylediklerimin do�rulu�unu
s�namak i�in, ba�ka bir terminal a��p orada ps komutunu �al��t�rd���n�zda
ayn� listeyi elde edeceksiniz, ancak bu sefer i�lem numaralar� farkl�
olacakt�r. Bu da, �al��an i�lemlerin birbirlerinden farkl� olduklar�n�
g�stermektedir.

<p>
Linux makinam�zda �al��an t�m i�lemlerin listesini elde etmek de 
m�mk�nd�r. ps komutunun man sayfas�na g�re, -e parametresi, t�m
i�lemleri se�mek i�in kullan�lmaktad�r. �imdi bir terminalde
"ps -e" komutunu �al��t�ral�m. Elde edece�imiz liste,
yukar�daki bi�imde, ancak �ok daha uzun olacakt�r. Listeyi daha
rahat bir �ekilde incelebilmek i�in ps komutunun ��kt�s�n� ps.log
dosyas�na y�nlendirelim:

<pre>
ps -e &gt; ps.log
</pre>

<p>
Olu�an dosyay�, tercih etti�iniz herhangi bir kelime
i�lemci veya en basitinden less komutu yard�m�yla inceleyebilirsiniz.
Yaz�n�n ba��nda da s�z�n� etti�im gibi, �al��an i�lem say�s�, tahmin
etti�mizden daha fazlad�r. Ayr�ca, listede komut sat�r�ndan veya
grafik ortamdan �al��t�rd���m�z programlar�n d���nda da i�lemler
�al�t���n� fark ediyoruz. Bu i�lemlerden baz�lar�n�n isimleri 
de biraz garip. Sistemizde �al��an i�lemler ve say�lar�, sisteminizin
yap�land�r�lmas�na ba�l�d�r. Ancak, baz� ortak i�lemler de vard�r.
Sistemde yapt���n�z ayarlar ne olursa olsun, i�lem numaras� 1 ve t�m
i�lemlerin babas� olan i�lemin ad� hep "init" tir. ��lem numaras�n�n
1 olmas�, bu program�n i�letim sistemi taraf�ndan hep ilk s�rada 
�al��t�r�lmas�ndand�r. Fark edece�imiz ba�ka bir konu da, baz� isimlerin
sonlar�n�n  hep "d" karakteri olmas�d�r. Bunlara verilen genel isim "daemons" 
dur ve sistemin en �nemli i�lemlerindendirler. init ve daemon lar� daha 
sonraki bir yaz�da ayr�nt�l� olarak ele alaca��z.

<H3>libc'de �oklui�lem</H3>

<p>
��lem kavram�n� ve onun i�letim sistemimiz i�in olan �nemini
kavrad���m�za g�re, daha ileriye giderek �oklui�lem
yapan programlar yazmaya ba�layaca��z. A��kar olan ayn� anda
birden fazla i�lemin birden �al��t�r�lmas�ndan, daha yeni bir problem 
olan, i�lemler aras� haberle�me ve zamanlamas�na (senkronizasyon)
ge�ece�iz. Bu problemi iki g�zel y�ntem olan mesajlar (messages) ve 
saya�lar (semaphors) ile ��zece�iz. Bunlar s�re�ler (threads) konusunu
i�leyece�imiz sonraki bir yaz�da ayr�nt�l� olarak anlat�lacakt�r.
Daha sonra da, t�m anlat�lan y�ntemleri kullanarak, kendi uygulamalar�m�z�
yazma zaman� gelecektir. 

<p>
Standart C k�t�phanesi (Linux,taki libc, glibc taraf�ndan uyarlanm��t�r.)
Unix System V'in �oklui�lem y�ntemlerini kullanmaktad�r. Unix System V
(Bundan sonra SysV diyece�iz.) ticari bir Unix uyarlamas� olup, BSD 
Unix ailesi gibi SysV Unix ailesinin de yarat�c�s�d�r.

<p>
libc'de i�lem numaras�n�n de�erini tutmak �zere, tamsay� (integer)
�eklinde, pid_t de�i�ken tipi tan�mlanm��t�r. Bunadan b�yle, pid_t
de�i�ken tipini i�lem numaralar� i�in kullanaca��z. S�rf daha basit olmas�
a��s�ndan tamsay� de�i�ken tipini kullanmak da m�mk�nd�r. 

<p>
Program�m�z�n i�lem numaras�n� elde etmeye yarayan fonksiyona bir g�zatal�m.

<pre>
pid_t getpid (void)
</pre>

<p>
Bu fonksiyon, pid_tile birlikte unistd.h ve sys/types.h ba�l�k dosyalar�nda
tan�mlanm��t�r. �imdi, amac� kendi i�lem numaras�n� bildiren bir program 
yazal�m. Tercih etti�iniz bir kelime i�lemcisi yard�m� ile
a�a��daki program� yaz�n�z. 

<pre>
#include &lt;unistd.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;stdio.h&gt;

int main()
{
  pid_t pid;
  
  pid = getpid();
  printf("The pid assigned to the process is %d\n", pid);

  return 0;
}
</pre>

Program� print_pid.c ad�nda kaydedin ve a�a��daki
komutla derleyin:

<pre>
gcc -Wall -o print_pid print_pid.c
</pre>

Derleme sonucunda, print_pid adl� �al��t�r�labilir bir program elde
etmi� olacaks�n�z. E�er, bulundu�unuz dizin yoltan�m�nda yoksa, program� 
ancak "./print_pid" olarak �al��t�rabilirsiniz. Program� �al��t�rd���n�zda
�ok b�y�k bir s�rpriz ile kar��la�mayacaks�n�z: Ekrana pozitif bir say�
g�r�ntileyecektir ve e�er birden fazla �al��t�r�l�rsa da, say�lar hep birbirinden
farkl� ve birer birer artan say�lar olacakt�r. Ard���k say�lar elde edilmesi
herzaman m�mk�n olmayabilir. Bu zaten olmas� gereken bir durum da de�il.
��nk�, print_pid program�n�n ard���k �al��t�r�lmas� aras�nda ba�ka i�lemler
sistem taraf�ndan �al��t�r�lm�� olabilir. Ard���k �al��t�rma aras�nda s�zgelimi,
ps komutunu �a�t�r�n.

<p>
�imdi bir i�lemin nas�l yarat�laca��n� ��renme zaman� geldi. Ancak,
daha �nce, bu i�lem s�ras�nda ger�ekte neler oldu�unu a��klamak gerek.
Bir A i�lemi i�erisinden B i�lemi yarat�ld���nda, iki i�lem benzerdir,
yani ikisi de ayn� koda sahip, bellek alan� ayn� veriler ile dolu (Bellek
alan� ayn� de�il.) ve ayn� i�lemci durumuna sahiptir. Bu a�amadan sonra i�lemler
iki farkl� �ekilde devam edebilir: Kullan�c�n�n verece�i giri� bilgisine veya
rastgele olan bir veriye g�re. A i�lemine baba "father", B i�lemine de o�ul
(son) ad� verilmektedir. init i�leminin t�m i�lemlerin babas� 
deyimi �imdi daha iyi anla��l�yor olmas� gerekir. Yeni i�lem yaratan
fonksiyonun ad�:

<pre>
pid_t fork(void)
</pre>

d�r. Fonksiyonun d�n�� de�eri i�lem numaras�d�r. Daha �nce de 
s�yledi�imiz gibi, i�lem kendisini baba ve o�ul olarak, daha sonralar�
farkl� i�ler yerine getirmek i�in, ikiye ay�rmaktad�r (kopyalamaktad�r).  
Ancak, bu i�lemden hemen sonra, hangisi �nce �al��acakt�r? Baba m�, o�ul mu?
Cevap �ok basit: �kisinden biri. Hangi i�lemin �al��t�r�lmas� gerekti�i
i�letim sistemin zamanlay�c�(scheduler) ad� verilen bir
k�sm� taraf�ndan denetlenmektedir ve bu k�s�m, i�lemin baba m�, o�ul mu 
olup olmad���na bakmaks�z�n, ba�ka parametreleri g�ze alarak belli bir 
algoritmaya g�re karar vermektedir. 

<p>
Herneyse, ancak hangi i�lemin hangisi oldu�unu bilmek �nemlidir, ��nk�
program�n kodu ayn�d�r. Her iki i�lem de hem baba i�lemin hem de
o�ul i�lemin kodunu i�erecektir. �nemli olan herbirinin kendine
d��en pay� �al��t�rmalar�d�r. Konuyu daha anla��l�r yapmak i�in,
programlama �tesi bir dil gibi g�z�ken a�a��daki algoritmaya bir g�zatal�m:

<pre>
- FORK
- E�ER O�UL �SEN BUNU �ALI�TIR (...)
- E�ER BABA �SEN BUNU �ALI�TIR (...)
</pre>

fork fonksiyonu d�n�� de�eri olarak, o�ul i�leme '0' i�lem 
numaras�n�, baba i�leme de o�ul i�lemin i�lem numaras�n� 
�retmektedir. Dolay�s�yla d�n�� de�erine bakarak hangi i�lemde oldu�umuzu
��renmemiz m�mk�nd�r. C programlama dilindeki kar��l��� a�a��daki
gibi olacakt�r.

<pre>
int main()
{
  pid_t pid;

  pid = fork();
  if (pid == 0)
  {
    O�UL ��LEM�N KODU
  }
  BABA ��LEM�N KODU
}
</pre>

�oklui�lem olarak �al��an ger�ek bir program yazma zaman� geldi art�k.
A�a��daki, program� fork_demo.c dosyas� olarak kay�t edip, yukar�daki
komutlara benzer �ekilde derleyebilirsiniz. Program kendi kopyas�n� yaratacak
ve hem baba ve hem de o�ul i�lemler bir�ey yazacakt�r. Her�ey yolunda
giderse, elde edece�iniz ��kt� ikisinin bir kar���m� olacakt�r.

<pre>
(01) #include &lt;unistd.h&gt;
(02) #include &lt;sys/types.h&gt;
(03) #include &lt;stdio.h&gt;

(04) int main()
(05) {
(05)   pid_t pid;
(06)   int i;
  
(07)   pid = fork();
  
(08)   if (pid == 0){
(09)     for (i = 0; i  &lt; 8; i++){
(10)       printf("-SON-\n");
(11)     }
(12)     return(0);
(13)   }
  
(14)   for (i = 0; i &lt; 8; i++){
(15)     printf("+FATHER+\n");
(16)   }

(17)   return(0);
(18) }
</pre>

<p>
(01)-(03) sat�rlar� gerekli ba�l�k k�t�phaneleri (standart Giri�/��k�s I/O,
�oklui�lem) programa dahil etmektedir.<br>
GNU ortamlar�nda oldu�u gibi, main program� bir tamsay�y�,
program hatas�z bir �ekilde sona erdi�inde s�f�r, hatal� olarak sona erirse
hata numaras�n�, d�n�� de�eri olarak �retmektedir.
�u an i�in her�eyin hatas�z sonu�lanaca��n� varsayal�m. Temel kavramlar
anla��ld�k�a programa, hata denetimleri de ekleyece�iz.
(05) sat�r�nda, i�lem numaras�n� tutacak de�i�keni tan�ml�yoruz.
(06) sat�rda, d�ng�lerde kullanaca��m�z bir tamsay� de�i�keni tan�ml�yoruz.
Daha �ncede a��kland��� gibi tamsay� ve pid_t tipleri e�de�erdir. Biz
burada s�rf daha anla��l�r olsun diye b�yle kullan�yoruz.<br>
(07) sat�r�nda, o�ul i�lemine s�f�r ve baba i�lemine o�ul i�lemin 
i�lem numaras�n� geri g�nderecek olan fork fonksiyonunu �a��r�yoruz.
Hangisinin hangisi oldu�u denetim sat�r� (08) dir. 
(09)-(13) sat�rlar� o�ul, geriye kalan (14)-(16) sat�rlar� da
baba i�leminde �al��t�r�lacakt�r.<br> 
Hangi i�lemin �al��t���na ba�l� olarak, k�s�mlar�n yapt��� tek 
�ey 8'er defa ekrana "-SON-" veya "+FATHER+" yaz�p 0 de�eri ile
program� bitirmektedir. Bu �ok �nemlidir, ��nk� "return" olmadan,
o�ul i�leminin komutlar�n� yerine getrdikten sonra program�n ak���
gere�i baba i�lemlerine ge�erek devam edebilir. �sterseniz bir deneyin.
Bilgisayar�n�za zarar vermeyecektir, ancak istedi�imizi de tama olarak
yerine getirmemi� olacakt�r. Bu �ekildeki hatalar�n ay�klanmas�
zor olmaktad�r, ��nk� �zellikle karma��k �oklui�lem programlar�n
�al��t�r�lmas� sonucunda farkl� sonu�lar elde edilecek
ve b�ylece hata ay�klanmas� imkans�zla�acakt�r.  

<p>
Program� �al��t�rd���n�zda belkide sonu�tan memnun
kalmayacaks�n�z. Nedenine gelince, elde edilen sonu�lar�n "+FATHER+"
ve "-SON-" bir kar���m�ndan ziyade, �nce "+FATHER+" sat�rlar�n�n ard�ndan
"-SON-" gelecek veya tam tersi de olabilir. Ancak, program� birden fazla
defa �al��t�r�n, belki o zaman sonu� de�i�ebilir.

<p>
Herbir printf'ten �nce rastgele bekleme s�resi eklersek, daha
fazla �oklui�lem hissi elde etmi� oluruz. Bunu yapabilmek i�in
sleep ve rand fonksiyonlar�n� kullan�yoruz.

<pre>
sleep(rand()%4)
</pre>

Bu komut sayesinde program, 0 ile 3 aras�nda (% tamsay� b�lmede kalan k�sm�n�
�retmektedir.) rastgele bir say� kadar bekleme yapacakt�r.
�imdi program a�a��daki gibi de�i�mi�tir:

<pre>
(09)  for (i = 0; i &lt; 8; i++){
(-&gt;)    sleep (rand()%4);
(10)    printf("-FIGLIO-\n");
(11)  }
</pre>

Ayn� �eyi baba i�lemin program par�as� i�in de yapmak gerek. De�i�tirilen
program� fork_demo2.c ad� alt�nda saklay�n ve derledikten sonra bir
�al��t�r�n. �imdi daha yava� �al��maktad�r, ancak ��kt�daki s�ra farkl�l���n�
daha iyi g�rme f�rsat�m�z oldu:

<pre>
[leo@mobile ipc2]$ ./fork_demo2
-SON-
+FATHER+
+FATHER+
-SON-
-SON-
+FATHER+
+FATHER+
-SON-
-FIGLIO-
+FATHER+
+FATHER+
-SON-
-SON-
-SON-
+FATHER+
+FATHER+
[leo@mobile ipc2]$
</pre>

<p>
�imdi kar��m�za ��kacak problemlere bir g�z gezdirelim:
�oklui�lem ortam�nda baba i�leminden farkl� i�ler
yapabilecek birden fazla o�ul i�lemi yaratmam�z olas�d�r. 
Do�ru zamanda do�ru i�i yapabilmek i�in, baba il�lem,
o�ul i�lemler ile haberle�mek zorundad�r. En az�ndan bir 
zaman ayarlanmas� (synchronize) yap�lmas� gerekmektedir.
B�yle bir zaman ayarlanmas�n� olas� k�lan ilk y�ntem 
wait fonksiyonunu kullanmakt�r.

<pre>
pid_t waitpid (pid_t PID, int *STATUS_PTR, int OPTIONS)
</pre>

Buradaki PID, sonu�lanmas�n� bekledi�imiz i�lemin i�lem numaras�,
STATUS_PTR o�ul i�lemin sonucunun sakland��� tamsay� tipinde bir 
i�aret�i (E�er, bilgi gerekmiyorsa, bu i�aret�inin de�eri NULL 
olmaktad�r.) ve OPTIONS �e�itli se�eneklerin se�ilebilece�i bir de�eri,
ancak biz �imdilik onunla ilgilenmiyoruz, g�stermektedir. 

Bu, baba i�lemin o�ul i�lemin sona ermesini bekledi�i ve daha sonra program� 
sona erdirdi�i bir �rnektir.

<pre>
#include &lt;unistd.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;stdio.h&gt;

int main()
{
  pid_t pid;
  int i;
  
  pid = fork();
  
  if (pid == 0){
    for (i = 0; i &lt; 14; i++){
      sleep (rand()%4);
      printf("-SON-\n");
    }
    return 0;
  }

  sleep (rand()%4); 
  printf("+FATHER+ Waiting for son's termination...\n");
  waitpid (pid, NULL, 0);
  printf("+FATHER+ ...ended\n");

  return 0;
}
</pre>

Baba i�leminin k�sm�na sleep fonksiyonu, farkl� �al��t�rma
durumlar�n� ortaya koymak i�in eklenmi�tir. Program� fork_demo3.c
olarak kay�t edelim ve derledikten sonra da �al��t�ral�m.
��te �imdi zaman ayarlamas� yap�lm�� ilk program�m�z� yazm��
olduk!

<p>
Bir sonraki yaz�da zamanlama ayarlamas� ve i�lemler aras� ileti�im
konusu hakk�nda daha fazla bilgi edinece�iz. �u ana kadar anlat�lan
fonksiyonlar� kullanarak kendi programlar�n�z� yaz�n ve
a��klamalar� ile birlikte .c dosyas� halinde bana g�nderin. B�ylece
ben aralar�ndan iyi olan ��z�mler ile k�t�leri g�sterme �ans� elde
etmi� olurum. Ad�n�z� ve e-posta adresinizi yazmay� unutma�n. �yi �al��malar! 

<H3>�nerilen kaynaklar</H3>

<ul>
<li>Silberschatz, Galvin, Gagne, <b>Operating System Concepts -
	Sixth Edition</b>, Wiley&amp;Sons, 2001
<li>Tanenbaum, WoodHull, <b>Operating Systems: Design and Implementation
	- Second Edition</b>, Prentice Hall, 2000
<li>Stallings, <b>Operating Systems - Fourth Edition</b>, Prentice Hall, 2002
<li>Bovet, Cesati, <b>Understanding the Linux Kernel</b>, O'Reilly, 2000
</ul>

</BODY></HTML>