c dili etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
c dili etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

19 Mart 2013 Salı

Fork Bombing ve Korunumu

İsminden de anlaşılacağı gibi,bir process in kontrol dışı çoğalması ve kaynakların hunharca tüketilip sistemi dondurup,devre dışı haline getirmesidir.
Bir DOS(denial of service) saldırısıdır.Prosesler geometrik bir şekilde(1,2,4,8,16,32....) artacağı için memoryde akıl almaz bir kaynak tüketimi ve cpu nun işlem gücünü çalarak sistem üzerinde çalışan diğer hizmetlerin,programların çalışmasını engeller.
Şematize Fork Bombing

Fork Bombing den nasıl korunuruz ?

Unix türü işletim sistemlerinde kullanıcının bir oturumda açabileceği process sayısı önceden belirlenmiştir.Kullanıcı bu process sayısını kesinlikle aşamaz.unix te ulimit shell komutuyla bu sınırlama gerçekleştirilebilir.

Windows türü işletim sistemlerinde bu işlem process sayısı olarak değil de cpu kullanımı olarak ele alınmıştır.
kullanıcıların cpu kullanımı sınırlandırılır.

Basit bir Fork Bombing
Unix tabanlı işletim sisteminize aşağıdaki kodu yazıp çalıştırarak ne kadar çaresiz kalabileceğinizi öğrenebilirsiniz :)

#include <stdio.h>
#include <unistd.h>
void main(){
while(1){
fork();}
}
NOT:Derleyip çalıştırmadan önce açık kalan kayıt edilmemiş programlarınızı kapatın.

7 Mart 2012 Çarşamba

if( fork() ) ????

if(fork()) nedir? if( fork() ) aslında if( fork() != 0 ) yani fork komutunun geri dönüş değerine göre child mi yoksa parent mi döndürecek onu göstermektedir.Bildiğimiz gibi sıfır dönerse child,sıfırdan farklı dönerse parent olduğunu gösterir.Eğer -1 döndürürse hata verir bunuda unutmayalım


#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>




int main()
{
pid_t cocuk_pid;
printf("Parent process id = %d\n", (int)getpid() );
cocuk_pid=fork();


if (cocuk_pid!=0)
{
printf("burası parenttir , process id =%d\n",(int)getpid());
printf("child process id = %d\n",(int)cocuk_pid);
}
else
{
printf("burası child processdir, process id=%d\n", (int)getpid());
}
return 0;
}


fork() komutu ve C diliyle network e giriş

Bildiğimiz gibi çalıştırdığımız programların arkaplanda nelerin döndüğünü baktığımızda karşılaştığımız kavramlardan biride processlerdir.Process tam olarak program değildir.Programlar processlerin işlemesiyle çalışır.Processlerde çalıştırılan programın kodları,değişkenleri,işlemcinin bayraklarının durumları gibi işletim sisteminin programla çalıştırılan programla haberleşmesini sağlayan durumlar bulunur. fork() komutu ise bir process ten başka bir process kopyalamak için üretilmiştir
 Öncelikle her processin unique dediğimiz nev-i şahsına münhasır id leri bulunur.Bunu c dilinde şu komutlarla gösterebilir.
#include <stdio.h>
#include <unistd.h>
int main() 
{ 
 printf("process id : %d\n",(int)getpid()); 
 }
Gelelim fork() komutuna.fork() komutu process kopyalamaya yarar.Kopyalanan process e child process,kopyalandığı process e parent process denir.Child process,parent process id sinden bir fazlası verilecek şekilde kopyalanır.
Burada dikkat etmemiz gereken husus return nun iki defa gerçekleşmesidir.  Parent process e ve child process e aynı anda dönüş yapılır.
#include <stdio.h>
#include <unistd.h>
int main(void)
{
int forkResult;
printf("process id = %i\n",getpid());
forkResult=fork();
printf("process id = %i - result %d\n",getpid(),forkResult);
return 0;
}






Gördüğümüz gibi 2289 parent processimizn id sidir(PPID) 2290 ise child processimizin id sidir.
process id:2289 - result 2290(parent process)
process id:2289 - result 0(child process)

3 Mart 2012 Cumartesi

Ubuntu'da C kodu yazmak ve çalıştırmak

1.Adım
Uygulamalar(Applications)>Donatlar(Accessories)>Uçbirim(Terminal) açılır
2.Adım
Karşımıza çıkan konsola gedit deneme.c yazılır
deneme kısmına dosyanın adı yazılır örnek olsun diye deneme yazdım.

3.Adım
Kodu yazdıktan sonra karşınıza editör çıkacak.Burası C kodumuzu yazacağımız yerdir.Örnek olarak basit bir C kodu yazılmıştır.
4.Adım
Kodumuzu yazdıktan sonra kaydedip kapatıldıktan sonra konsola geri dönülür.Yanlız kaydetmeyi unutmayın yoksa dosyanız yazdığınız gibi derlenip çalışmaz.
Konsola gcc -c deneme.c yazılır.Yazdıktan sonra deneme.c nin bulunduğu dosyanın içinde deneme.o adında bir dosya oluşur
5.Adım
Konsol satırına gcc deneme.o -o deneme yazılır
Burada gcc kullandığımız c derleyicimizin adı.deneme.o object dosyası dediğimiz deneme.c dosyasından türetilmiş makine kodlarını barındıran dosyadır. -o komutu object dosyasını çalıştırılabilir bir programa dönüştüren koddur.deneme ise çalıştırılabilir C programımızın adıdır.
Yazdıktan sonra konumda çalıştırılabilir deneme adında çalıştırılabilir dosya oluşacaktır.
6.Adım
Konsol satırına ./deneme yazılarak C programımız çalıştırılır.

THE END