Yazan : Şadi Evren ŞEKER

Bu yazının amacı, bilgisayar bilimlerinde, özellikle de işletim sistemlerinde kullanılan exec() fonksiyon ailesini açıklamaktır. Bu fonksiyon grubu, kabaca bilgisayarımızın dosya sisteminde bulunan farklı bir programı, yazmış olduğumuz C programı içerisinden çağırmaya yarar.

Çalışma durumunu örnek bir kod üzerinden gösterelim:

1

#include <unistd.h>

2

main()

3

{

4

   execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", (char *) 0);

5

}

Yukarıdaki kodda, görüldüğü üzere basit bir main fonksiyonu olan, oldukça küçük bir C kodunda, tek bir satır ile, bir unix komutu olan “ls” komutu çalıştırılmıştır. Bu işlem sırasında exec fonksiyon gruplarından execl fonksiyonu çağrılmıştır.

Programın çıktısı aşağıda verilmiştir:

new-host-2:deneme sadievrenseker$ gcc exec.c
new-host-2:deneme sadievrenseker$ ./a.out
total 32
-rw-r--r--  1 sadievrenseker  staff    98 12 Mar 17:22 exec.c
-rwxr-xr-x  1 sadievrenseker  staff  8696 12 Mar 17:23 a.out
new-host-2:deneme sadievrenseker$

Yukarıdaki çıktıda da görüldüğü üzere kod çalıştırıldıktan sonra, “ls” komudu çalıştırılmış ve ekrana bu kodun çıktısı basılmıştır.

Exec grubu fonksiyonlardan bir diğeri de execv fonksiyonudur. Bu fonksiyonu kullanan bir örnek kod aşağıda verilmiştir:

1

#include <unistd.h>

2

main()

3

{

4

   char *args[] = {"/bin/ls", "-r", "-t", "-l", (char *) 0 };

5

 

6

   execv("/bin/ls", args);

7

}

Yukarıdaki bu kodun çıktısı da aşağıdaki şekildedir:

new-host-2:deneme sadievrenseker$ gcc execv.c 
new-host-2:deneme sadievrenseker$ ./a.out
total 40
-rw-r--r--  1 sadievrenseker  staff    98 12 Mar 17:22 exec.c
-rw-r--r--  1 sadievrenseker  staff   117 13 Mar 11:17 execv.c
-rwxr-xr-x  1 sadievrenseker  staff  8720 13 Mar 11:17 a.out
new-host-2:deneme sadievrenseker$

Görüldüğü üzere aynı işlem yeni fonksiyonumuz olan execv ile de çalıştırılmıştır. Exec grubu fonksiyonlar arasında ufak farklılıklar bulunur ve bu farklılıklar aldıkalrı parametrelerdir. Parametreler arasındaki farklar ise aşağıda listelenmiştir.

int execl(const char * path , const char * arg0 , ..., const char * argn , (char *)0);

int execle(const char * path , const char * arg0 , ..., const char * argn , (char *)0, char *const envp []);

int execlp(const char * file , const char * arg0 , ..., const char * argn , (char *)0);

int execlpe(const char * file , const char * arg0 , ..., const char * argn , (char *)0, char *const envp []);

int execv(const char * path , char *const argv []);

int execve(const char * path , char *const argv [], char *const envp []);

int execvp(const char * file , char *const argv []);

int execvpe(const char * file , char *const argv [], char *const envp []);

Yukarıdaki fonksiyonlarını parametrelerinde verilen kelimelerin anlamları kısaca şu şekilde:

path: programın çalıştırılacağı yol. Bu yolun sonunda programın da ismi yazılmalı. Örneğin /bin/ls şeklinde, bin dizini altındaki ls programı.

arg0… argn: bunun anlamı bir liste şeklinde virgül ile ayrılarak programa verilecek olan parametreler yazılabilir. Örneğin execl kodumuzda "-r", "-t", "-l" şekilinde parametreleri verimiştik.

argv[] : programa verilecek olan parametrelerin içinde bulunduğu bir dizi. Örneğin execv kodumuzda bir dizi tanımlayıp içerisine bu parametreleri eklemiştik.

envp[]: ortama özgü değişken göstericisi (environment pointer). Programın çalışacağı ortamı gösteren değişkendir ve bir bağlı liste mantığı ile çalışarak birbirlerini işaret ederler. Son elemanın gösterdiği değer null olmalıdır.


Yorumlar

  1. yusuf

    öncelikle yazı içi teşekkürler hocam..

    exec functionlar ile linux da ELF executable dosyaları execleriz/çalıştırız.

    fakat dikkat..!

    exec functionın asıl amacı geçerli processin image(imajını) yani exec systemcall çağrısını yapan ile execlenecek processin imageni değiştirmesidir.yani bu ne demek ?

    şu demek sizin execlemenizden dolayı yeni bir process yaratılmaz.bu yüzden PID(process id) değişmez.

    text,data,heap,stack yerlerini execlenerek çağırılan executable ele geçirir…Linux çatısı altında düşünürsek LOAD segmentlerin yüklemesi yapılır..

    kısacası kernel amcanın execve kullanarak executable fileları çalıştırdığını görürsünüz işte şunun gibi…

    # strace ./finally.out
    execve(“./finally.out”, [“./finally.out”], [/* 36 vars */]) = 0
    …….
    …..

    asıl şu an ki soru ben buraya nasıl geldim ya da niçin geldim?
    inanın hocam 10 dk dır ben sizin yazınıza nasıl geldim diye düşündüm hatta arama geçmişimide kontrol ettim belki inanamayacaksınız ama hiç bir ipucu yok..

    computerımı açtım ve direk bu sayfaya geldim çok tuhaf sanki 14 milyar yıllık bir tesadüfün gerçekleşmesi gibi..

    nasıl geldiğimi bulamadım..

    iyi günler..

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir