SYSTEM(3)

İ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.