İSİM¶
system - bir kabuk komutunu çalıştırır
KULLANIM¶
#include <stdlib.h>
int system (const char *dizge);
AÇIKLAMA¶
system() dizge ile belirtilen bir komutu,
/bin/sh -c
dizge çağrısıyla
çalıştırır ve komutun
çalışması bittikten sonra geri döner.
Komutun çalışması esnasında,
SIGCHLD
engellenir,
SIGINT ve
SIGOUT göz ardı edilir.
DÖNÜŞ DEĞERݶ
Herhangi bir hatada -1 döner (fork başarısız
olmuş gibi), aksi takdirde komutun dönüş durumu
döner. Bu sonuncu dönüş durumu
wait(2) de
belirtilen biçimde olur. Bundan dolayı, komutun
çıkış kodu WEXITSTATUS(
durum)
olacaktır.
/bin/sh'ın
çalıştırılamadığı
durumlarda, çıkış durumu,
exit(127) yapan
komutun durumu olacaktır.
Şayet
dizge değeri
NULL ise ve kabuk uygunsa,
system() sıfırsan farklı bir değer
döndürür; uygun değilse sıfır
döndürür.
system(), çocuk süreçlerden hiçbirinin
bekleme durumunu etkilemez.
UYUMLULUK¶
ANSI C, POSIX.2, BSD 4.3
NOTLAR¶
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(birşey) {
int donen = system("foo");
if (WIFSIGNALED(donen) &&
(WTERMSIG(donen) == SIGINT || WTERMSIG(donen) == SIGQUIT))
break;
}
Sistem bütünlüğünü bozmak için,
bazı çevre değişkenleri tuhaf değerlerle
kullanılabileceğinden,
system()'i suid veya sgid
yetkileri olan bir yazılımda kullanmayın. Onun yerine
exec(3) ailesine ait işlevleri kullanın, ama
execlp(3) veya
execvp(3) işlevleri hariç.
/bin/sh'ın bash'ın 2. sürümü
olduğu sistemlerde, bash başlatma sırasında
yetkileri tutacağından
system(), suid veya sgid
hakları olan yazılımlardan düzgün
çalışmayacaktır. (Debian
sh olarak
çağrıldığında bunu yapmayan
değiştirilmiş bir bash kullanır.)
/bin/sh'ın kullanılabilirliği aslında kontrol
edilmez; Daima kullanılabilir olduğu varsayılır.
ISO C kontrolün yapılmasını isterse de POSIX.2
kabuktan geri dönen değerin daima sıfırdan
farklı olması gerektiğini kabul eder
(çünkü kabuk olmayan bir sistem uyumlu değildir ve
uyum için kabuğun eklenmiş olması gerekmektedir).
Kabuk komutu için 127 döndürmek
mümkündür, bu nedenle kod,
execve()
çağrısının hata verdiğinin, kesin
bir kanıtı sayılamaz.
İLGİLİ BELGELER¶
sh(1),
signal(2),
wait(2),
exec(3).
ÇEVİREN¶
Yalçın Kolukısa <yalcink01 (at) yahoo.com>,
Kasım 2003