system - kabuk komutu çalıştırır
#include <stdlib.h>
- int system
- (const char *command);
system() kütüphane işlevi,
aşağıdaki gibi
exec(3) kullanarak belirtilen kabuk
komutunu yürüten bir alt süreç oluşturmak
için
fork(2) çağrısını
kullanır:
execl("/bin/sh", "sh", "-c", komut, (char *) NULL);
Komut tamamlanınca
system() işlevi döner.
Komutun yürütülmesi sırasında
system()
çağrısının
yapıldığı süreçte
SIGCHLD
engellenir,
SIGINT ve
SIGQUIT yok sayılır. (Bu
sinyaller, komutu yürüten alt süreç
içindeki öntanımlılarına göre
işlenir.)
command NULL ise
system(), sistemde bir kabuğun mevcut olup
olmadığını gösteren bir durum
döndürür.
system() işlevinin dönüş değeri
şunlardan biridir:
- •
-
command NULL ise, kullanılabilir bir kabuk
varsa sıfırdan farklı bir değer, yoksa 0
döner.
- •
- Bir alt süreç oluşturulamıyorsa
veya durumu alınamıyorsa -1 döner ve hata kodu
errno değişkenine atanır.
- •
- Alt süreçte bir kabuk
yürütülemezse, alt kabuk 127 durum koduyla
çağrılan _exit(2) ile
sonlandırılmış gibi bir durum koduyla (durum
& 0xFF) döner.
- •
- Tüm system()
çağrıları başarılı olursa
dönüş değeri komutu
çalıştıran alt kabuğun sonlanma durum
kodudur. (Kabuğun sonlanma durum kodu,
çalıştırdığı son komutun
sonlanma durum kodudur.)
Son iki durumda dönüş değeri,
waitpid(2)
sayfasında açıklanan makrolar (
WIFEXITED(),
WEXITSTATUS() vb.) kullanılarak incelenebilen bir "bekleme
durumu" kodudur.
system() herhangi bir başka alt sürecin bekleme durumunu
etkilemez.
system()
fork(2) ile aynı hatalardan herhangi biriyle
başarısız olabilir.
Bu bölümde kulllanılan terimlerin
açıklamaları
attributes(7) sayfasında
bulunabilir.
İşlev |
Öznitelik |
Değer |
system |
Evre Güvenliği |
ÇEG-evet |
POSIX.1-2001, POSIX.1-2008, C89, C99.
system() basitlik ve kolaylık sağlar:
fork(2),
execl(3) ve
waitpid(2)
çağrılarının tüm
ayrıntılarını ve ayrıca gerekli sinyal
yönlendirimlerini ele alır; ek olarak, kabuk komut için
olağan ikameleri ve G/Ç yönlendirmelerini
gerçekleştirir.
system() işlevinin ana maliyeti
verimsizliktir: kabuğu çalıştıran
süreci oluşturmak ve kabuğu
çalıştırmak için ek sistem
çağrıları gerekir.
_XOPEN_SOURCE özellik sınama makrosu
tanımlanırsa (herhangi bir başlık dosyası
dahil edilmeden önce),
waitpid(2) içinde
açıklanan makrolar (
WEXITSTATUS(), vb.),
<stdlib.h> dahil edildiğinde kullanılabilir hale gelir.
Bahsedildiği gibi;
system(),
SIGINT ve
SIGQUIT
sinyalini yoksayar. Bu, uygulamaların kendi
çocuklarının çıkış
durumlarını kontrol etmedikleri takdirde
aşağıdaki örnekteki gibi durdurulamaz bir
döngüden sürekli çağrılan
uygulamalara sebep olabilir.
while (birsey) {
int donen = system("foo");
if (WIFSIGNALED(donen) &&
(WTERMSIG(donen) == SIGINT || WTERMSIG(donen) == SIGQUIT))
break;
}
POSIX.1’e göre,
system() işlevinin
yürütülmesi sırasında
pthread_atfork(3) kullanılarak kaydedilen işleyicilerin
çağrılıp
çağrılmayacağı konusu
belirlenmemiştir. glibc gerçekleniminde bu tür
işleyiciler çağrılmamaktadır.
command NULL ise
/bin/sh’nin
kullanılabilirliğinin sınanması 2.1.3’ten
önceki glibc sürümlerinde
gerçekleştirilmezdi; bunun yerine her zaman
kullanılabilir olduğu varsayılırdı ve
system() bu durumda her zaman 1 döndürürdü.
POSIX.1-2001 bir kabuk sağlamak için uyumlu bir uygulama
gerektirmesine rağmen, çağıran uygulama daha
önce
chroot(2) çağrısı
yapmışsa, kabuk kullanılabilir veya
yürütülebilir olmayabileceğinden (POSIX.1-2001
tarafından bu durum belirtilmese de) Glibc 2.1.3’ten bu yana bu
sınama yapılmaktadır.
Alt süreçte bir kabuğun
yürütülemediği durumdan ayırt edilemeyecek
şekilde,
system() işlevinden dönen 127
değeri nedeniyle kabuk komutunun 127 durum koduyla sona ermiş
gibi görünmesi mümkündür.
Ayrıcalıklı bir uygulama (kullanıcı ve grup
kimliklerini değiştirebilen bir uygulama) içinden
system() işlevini kullanmayın, çünkü
sistem bütünlüğünü bozmak
için bazı ortam değişkenlerine tuhaf
değerler atanabilir. Örneğin,
PATH, keyfi bir
uygulamanın ayrıcalıklı
yürütülmesi için tahrif edilebilir. Bunun yerine
exec(3) işlev ailesini kullanın, ancak
execlp(3)
veya
execvp(3) işlevini kullanmayın (bir
yürütülebilir dosyayı aramak için
PATH ortam değişkenini de kullanır).
bash sürüm 2
başlatıldığında bir güvenlik
önlemi olarak ayrıcalıkları
düşürdüğünden,
/bin/sh’nin
bash sürüm 2 olduğu
sistemlerde
system() işlevi kullanıcı ve grup
kimliklerini değiştirebilen uygulamalardan
çağrıldığında düzgün
çalışmayacaktır. (Debian,
sh olarak
çağrıldığında bunu yapmayan,
dash(1) adlı farklı bir kabuk kullanır.)
Komutun bir parçası olarak kullanılan herhangi bir
kullanıcı girişi, beklenmeyen kabuk
komutlarının veya komut seçeneklerinin
yürütülmemesini sağlamak için dikkatlice
temizlenmelidir.
system() ayrıcalıklı bir
uygulamadan kullanıldığında bu tür riskler
özellikle ciddidir
sh(1),
execv(2),
fork(2),
sigaction(2),
sigprocmask(2),
wait(2),
exec(3),
signal(7)
© 2003 Yalçın Kolukısa
© 2022 Nilgün Belma Bugüner
Bu çeviri özgür yazılımdır:
Yasaların izin verdiği ölçüde
HİÇBİR GARANTİ YOKTUR.
Lütfen, çeviri ile ilgili bildirimde bulunmak veya çeviri
yapmak için
https://github.com/TLBP/manpages-tr/issues adresinde
"New Issue" düğmesine tıklayıp yeni bir
konu açınız ve isteğinizi belirtiniz.