İ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