Iya nih. Forking dieja &
:
echo child & echo parent
Apa yang mungkin membingungkan Anda adalah bahwa $$
itu bukan PID dari proses shell, itu adalah PID dari proses shell asli . Maksud dari membuatnya seperti ini adalah itu $$
adalah pengidentifikasi unik untuk contoh tertentu dari skrip shell: itu tidak berubah selama eksekusi skrip, dan itu berbeda dari $$
skrip lain yang berjalan bersamaan. Salah satu cara untuk mendapatkan PID aktual proses shell adalah sh -c 'echo $PPID'
.
Aliran kontrol dalam shell tidak sama dengan C. Jika dalam C Anda akan menulis
first(); fork(); second(); third();
maka setara shell
after_fork () { second; third; }
first; after_fork & after_fork
Bentuk shell sederhana first; child & parent
sesuai dengan idiom C yang biasa
first(); if (fork()) parent(); else child();
&
dan $$
ada dan berperilaku seperti ini di setiap shell Bourne-style dan di (t) csh. $PPID
tidak ada di shell Bourne orignal tetapi dalam POSIX (jadi abu, bash, ksh, zsh, ...).
Gilles 'SANGAT berhenti menjadi jahat'
sumber
&
adalah garpu, tidak ada eksekutif yang terlibat. Fork + exec adalah ketika Anda meluncurkan perintah eksternal.exec
, tetapi kedua bahasa memiliki aliran kontrol yang berbeda.&
memulai subkulit tempat perintah yang diberikan dijalankan. Fork + exec. Anda tidak bisa hanya menempatkan&
tanpa perintah sebelumnya untuk dieksekusi.&
garis dengan sendirinya. Tapi kamu tidak bisa. Itu tidak berarti "bercabang di sini". Ini berarti "jalankan perintah sebelumnya di latar belakang dalam sebuah subkulit".Ya, ini disebut subkulit . Kode shell di dalam tanda kurung dijalankan sebagai subkulit (garpu). Namun cangkang pertama biasanya menunggu anak untuk menyelesaikan. Anda dapat membuatnya tidak sinkron menggunakan
&
terminator. Lihat beraksi dengan sesuatu seperti ini:$ bash subsh.sh
sumber
&
adalah garpu sendiri. Jika Anda ingin mengeksekusi lebih dari satu pipa dalam proses anak, cukup menggunakan kawat gigi (yang melakukan pengelompokan tanpa membuat proses anak):{ sleep 2; echo child; } &
Tidak ada bash asli (atau, setahu saya, cara khas * nix shell) lainnya untuk melakukan ini. Ada banyak cara untuk menelurkan proses bercabang yang melakukan sesuatu yang lain secara serempak, tapi saya tidak berpikir ada sesuatu yang mengikuti semantik yang tepat dari sistem panggilan fork ().
Pendekatan tipikal adalah membuat skrip level atas Anda memunculkan pembantu yang hanya melakukan pekerjaan yang Anda inginkan. Jika Anda melakukan
$0 $@ &
atau apa pun, Anda akan mulai dari awal lagi dan perlu memikirkannya.Saya sebenarnya mulai memikirkan beberapa cara pintar di mana orang bisa melakukan hal itu ....
Tapi , sebelum otak saya terlalu terbawa oleh itu, saya pikir aturan yang cukup bagus adalah: jika Anda mencoba untuk menulis sesuatu di shell dan itu penuh dengan trik pintar dan Anda berharap untuk lebih banyak fitur bahasa, waktu untuk beralih ke bahasa pemrograman nyata .
sumber