Provided by: manpages-tr_2.0.6-2_all 

İSİM
system - kabuk komutu çalıştırır
BİLDİRİM
#include <stdlib.h>
int system (const char *command);
AÇIKLAMA
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.
DÖNÜŞ DEĞERİ
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.
HATALAR
system() fork(2) ile aynı hatalardan herhangi biriyle başarısız olabilir.
ÖZNİTELİKLER
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
UYUMLULUK
POSIX.1-2001, POSIX.1-2008, C89, C99.
EK BİLGİLER
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.
Yetersizlikler
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
İLGİLİ BELGELER
sh(1), execv(2), fork(2), sigaction(2), sigprocmask(2), wait(2), exec(3), signal(7)
ÇEVİREN
© 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.
Linux man-pages 5.10 6 Mart 2019 SYSTEM(3)