Saya punya masalah dengan Bash, dan saya tidak tahu mengapa.
Di bawah shell, saya masukkan:
echo $$ ## print 2433
(echo $$) ## also print 2433
(./getpid) ## print 2602
"getpid" adalah program C untuk mendapatkan pid saat ini, seperti:
int main() { printf("%d", (int)getpid()); return 0; }
Yang membingungkan saya adalah:
- Saya pikir "(perintah)" adalah sub-proses (apakah saya benar?), Dan saya pikir pidnya harus berbeda dengan pid induknya, tetapi mereka sama, mengapa ...
- ketika saya menggunakan program saya untuk menunjukkan pid antara kurung, pid itu menunjukkan berbeda, apakah itu benar?
- Apakah '$$' itu seperti makro?
Bisakah kamu membantuku?
getpid
akan menunjukkan ID proses yang berbeda bahkan jika itu tidak dijalankan dalam subkulit.echo $$ $BASHPID ; ( echo $$ $BASHPID )
menunjukkan hal itu. Kurung bundar membuat subkulit. Pernyataan dapat mengubah nilai variabel, dan shell induk tidak harus melihat perubahan itu. Ini diimplementasikan sebagaifork()
operasi.Jawaban:
$$
didefinisikan untuk mengembalikan ID proses induk dalam subkulit; dari halaman manual di bawah "Parameter Khusus":Di
bash
4, Anda bisa mendapatkan ID proses anakBASHPID
.sumber
echo $$; (echo $$; (echo $$))
gema pid yang sama tiga kali$ Expands to the process ID of the shell
apakah begituecho $
hanya menggemakan $ literal.$
sendiri bukanlah ekspansi parameter. Halaman manual mengacu pada nama parameter khusus, yaitu$
; itu tidak mengklaim bahwa itu$
sendiri mengembang.echo $BASHPID
bekerja di bash 4 dan 5 (tetapi tidak versi 3.2.57 pada MacOS)Anda dapat menggunakan salah satu dari yang berikut ini.
$!
adalah PID dari proses latar belakang terakhir.kill -0 $PID
memeriksa apakah masih berjalan.$$
adalah PID dari shell saat ini.sumber
kill -0 $!
jika kita berbicara tentang proses latar belakang?PID
tidak disetel ke apa pun secara default.$$
adalah alias dalam Bash ke skrip PID saat ini . Lihat perbedaan antara$$
dan di$BASHPID
sini , dan tepat di atas bahwa variabel tambahan$BASH_SUBSHELL
yang berisi tingkat bersarang.sumber
Coba
getppid()
jika Anda ingin program C Anda mencetak PID shell Anda.sumber
Jika Anda bertanya bagaimana cara mendapatkan PID dari perintah yang dikenal itu akan menyerupai sesuatu seperti ini:
Jika Anda telah mengeluarkan perintah di bawah ini # Perintah yang dikeluarkan adalah ***
Maka Anda akan menggunakan:
Apa yang terjadi di sini adalah mem-pipe semua karakter unik yang diperlukan ke suatu bidang dan bidang itu dapat digaungkan menggunakan
echo $ PIDs
sumber
ini cara univesal untuk mendapatkan pid yang benar
pid=$(cut -d' ' -f4 < /proc/self/stat)
sama bagusnya bekerja untuk sub
periksa output
sumber