C'de Exec Sistem Çağrısı

Exec System Call C



Exec ailesinin C'de birçok işlevi vardır. Bu C işlevleri temel olarak, ana programın ayrı bir işlemde bir sistem komutunu çalıştırmak ve çıktıyı yazdırmak için kullanılır.

Bu yazıda, exec işlev ailesi hakkında konuşacağım ve size bu exec ailesi işlevlerinin her birinin C'de nasıl kullanılacağını göstereceğim. Haydi başlayalım.







Exec Ailesindeki C Sistem İşlevleri:

exec işlev aileleri başlıkta tanımlanır unistd.h . Bu nedenle, bu fonksiyonları kullanmak istediğiniz C programında bu başlığı kullanmalısınız.



Kullanılabilir yürütme işlevleri, işlev parametreleriyle birlikte aşağıda verilmiştir:



  • int execl(const char *yol, const char *arg, …, NULL);
  • int execlp(const char *dosyası, const char *arg, …, NULL );
  • int execv(const char *yol, char *const argv[]);
  • int execvp(const char *dosyası, char *const argv[]);
  • int execle(const char *yol, const char *arg, …, NULL, char * const envp[] );
  • int execve(const char *dosyası, char *const argv[], char *const envp[]);

Bu işlevlerin her birinin ne yaptığını ve nasıl kullanılacağını görelim.





execl() Sistem İşlevi:

execl()'de sistem işlevi, yürütülebilir ikili dosyanın (ör. / bin / ls ) birinci ve ikinci argüman olarak. Ardından, argümanlar (yani -lh , /ev ) yürütülebilir dosyaya geçmek istediğiniz ve ardından BOŞ . Ardından execl() sistem işlevi komutu çalıştırır ve çıktıyı yazdırır. Herhangi bir hata oluşursa, execl() -1 değerini döndürür. Aksi takdirde, hiçbir şey döndürmez.

Sözdizimi:

intyürütmek(const karakter *yol, const karakter *sinirli,...,BOŞ);

execl() sistem fonksiyonunun bir örneği aşağıda verilmiştir:



#Dahil etmek

intana(geçersiz) {
karakter *ikiliYol= '/ bin / ls';
karakter *arg1= '-h';
karakter *arg2= '/ev';

yürütmek(ikiliYol,ikiliYol,arg1,arg2,BOŞ);

dönüş 0;
}

koştum ls -lh / ev execl() sistem işlevini kullanarak komut. Gördüğünüz gibi, doğru sonuç görüntülenir.

execlp() Sistem İşlevi:

execl() kullanmaz YOL Çevre değişkeni. Bu nedenle, yürütülebilir dosyanın tam yolu, onu execl() ile çalıştırmak için gereklidir. execlp(), PATH ortam değişkenini kullanır. Bu nedenle, PATH'de yürütülebilir bir dosya veya komut varsa, komut veya dosya adı onu çalıştırmak için yeterlidir, tam yola gerek yoktur.

Sözdizimi:

intexeclp(const karakter *dosya, const karakter *sinirli,...,BOŞ);

execlp() sistem fonksiyonunu kullanarak execl() örneğini aşağıdaki gibi yeniden yazabiliriz:

#Dahil etmek

intana(geçersiz) {
karakter *program adı= 'l';
karakter *arg1= '-h';
karakter *arg2= '/ev';

execlp(program adı,program adı,arg1,arg2,BOŞ);

dönüş 0;
}

sadece komut adını geçtim ls , tam yol değil / bin / ls . Gördüğünüz gibi, öncekiyle aynı çıktıyı aldım.

execv() Sistem İşlevi:

execl() işlevinde, yürütülebilir dosyanın parametreleri işleve farklı argümanlar olarak iletilir. execv() ile, NULL sonlandırılmış bir dizideki tüm parametreleri iletebilirsiniz. bağımsız değişken . Dizinin ilk öğesi, yürütülebilir dosyanın yolu olmalıdır. Aksi takdirde, execv() işlevi, tıpkı execl() işlevi gibi çalışır.

Sözdizimi:

intyürütme(const karakter *yol, karakter *constbağımsız değişken[]);

execl() örneğini aşağıdaki gibi yeniden yazabiliriz:

#Dahil etmek

intana(geçersiz) {
karakter *ikiliYol= '/ bin / ls';
karakter *argümanlar[] = {ikiliYol, '-h', '/ev',BOŞ};

yürütme(ikiliYol,argümanlar);

dönüş 0;
}

Gördüğünüz gibi, doğru çıktıyı alıyorum.

execvp() Sistem İşlevi:

execv() sistem işleviyle aynı şekilde çalışır. Ancak PATH ortam değişkeni kullanılır. Bu nedenle, yürütülebilir dosyanın tam yolu, execlp()'deki gibi gerekli değildir.

Sözdizimi:

intexecvp(const karakter *dosya, karakter *constbağımsız değişken[]);

execv() örneğini aşağıdaki gibi yeniden yazabiliriz:

#Dahil etmek

intana(geçersiz) {
karakter *program adı= 'l';
karakter *argümanlar[] = {program adı, '-h', '/ev',BOŞ};

execvp(program adı,argümanlar);

dönüş 0;
}

Gördüğünüz gibi, doğru çıktı görüntülenir.

execle() Sistem İşlevi:

Tıpkı execl() gibi çalışır ancak bununla birlikte kendi ortam değişkenlerinizi de sağlayabilirsiniz. Ortam değişkenleri bir dizi olarak iletilir envp . son elemanı envp dizi NULL olmalıdır. Diğer tüm öğeler, anahtar/değer çiftlerini dize olarak içerir.

Sözdizimi:

intyönetici(const karakter *yol, const karakter *sinirli,...,BOŞ, karakter * constenvp[] );

execle() sistem fonksiyonunun bir örneği aşağıda verilmiştir:

#Dahil etmek

intana(geçersiz) {
karakter *ikiliYol= '/bin/bash';
karakter *arg1= '-C';
karakter *arg2= 'dışarı attı'$HOSTNAME'i ziyaret edin:Tarayıcınızdan $PORT.'';
karakter *constortam[] = {'HOSTNAME=www.linuxhint.com', 'PORT=8080',BOŞ};

yönetici(ikiliYol,ikiliYol,arg1,arg2,BOŞ,ortam);

dönüş 0;
}

İki ortam değişkenini geçtim HOSTNAME ve LİMAN execle() işlevine. Gördüğünüz gibi, onlara yürütülebilir dosyadan erişebiliyorum. /bin/bash .

execve() Sistem İşlevi:

Tıpkı execle() gibi, execve() ile birlikte kendi ortam değişkenlerinizi sağlayabilirsiniz. Ayrıca execv()'de yaptığınız gibi argümanları diziler olarak da iletebilirsiniz.

Sözdizimi:

intyürütmek(const karakter *dosya, karakter *constbağımsız değişken[], karakter *constenvp[]);

execle() örneği aşağıdaki gibi yeniden yazılabilir:

#Dahil etmek

intana(geçersiz) {
karakter *ikiliYol= '/bin/bash';
karakter *constargümanlar[] = {ikiliYol, '-C', 'dışarı attı'$HOSTNAME'i ziyaret edin:$PORT
tarayıcınızdan.'',BOŞ};
karakter *constortam[] = {'HOSTNAME=www.linuxhint.com', 'PORT=8080',BOŞ};

yürütmek(ikiliYol,argümanlar,ortam);

dönüş 0;
}

Gördüğünüz gibi execle() örneğindeki çıktının aynısını alıyoruz.

Linux'ta sistem programlaması için C'deki exec işlev ailesini bu şekilde kullanırsınız. Bu makaleyi okuduğunuz için teşekkürler.