“& Bin / sh -c ls /” komutu ile sh temp.sh (sadece bir satır ls / içeren) arasında işlem ve alt işlem görünümünde bir fark var mı?


0

Yukarıdaki komutu çalıştırma komutu ile aşağıdaki kod arasındaki fark nedir? #include int main ( ) { int return_value; return_value = system ( "ls /" ); return return_value; }

Yanıtlar:


0

system("ls /")Bir shsüreci doğuracak , argüman vererek -cve ls /. Bu nedenle, programınızın çalıştırılması ve sh -c "ls /"bir kabuğa yazma işlemi arasındaki temel fark , ilk durumda, programınızı içeren bir işlem olduğudur. Böylece ls, çalışırken çalışırken işlem ağacını yakalarsanız , şöyle bir şey görürsünüz:

init───konsole───bash───myprog───sh───ls

onun yerine

init───konsole───bash───sh───ls

execİşlev ailesinden birini kullandıysanız, shtamamen kullanmaktan kaçınabilir ve programınızı lsyardımcı programla değiştirebilirsiniz . Bu durumda, göreceksiniz:

init───konsole───bash───ls

Program şöyle görünebilir:

int main(int argc, char** argv) {
  return execlp("ls", "ls", "/");
}

Seçenek bashdahilinde yürütülen -ckomut basit bir komut ise birçok kabuk - dahil - bunu otomatik olarak yapar . Öyle olsa bile, kabuğunu yerine koyabileceğiniz bir işlemle değiştirmek için bir kabuğun yumurtlama noktası yoktur exec.

Dosyayı okumak için açmak için gerekenler dışında sh -c "ls -l"ve arasında çok az bir fark var sh ls-l.sh.


Ben birini kullanıyorsanız exec fonksiyonlarının ailesi, süreç ağaç gibi olmalıdır:init───konsole───bash───myprog───ls
user3872279

Haklı mıyım yoksa bu süreci yanlış mı anladım?
kullanici3872279

@ user3872279 Hayır, işleminizi ed işlemi ile exec değiştirirexec . exec(Belirtilen programı bulmak mümkün olmadığı gibi) görev yapmasını engelleyen bir hata varsa arama yalnızca döndürür. Geri systemdönüş olandan oldukça farklı .
rici
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.