Saya melihat output strace dari proses bash berjalan yang terhubung ke terminal, untuk tujuan pendidikan.
Proses bash saya memiliki PID 2883.
saya mengetik
[OP@localhost ~]$ strace -e trace=openat,read,write,fork,vfork,clone,execve -p 2883 2> bash.strace
Ke dalam terminal. Saya kemudian pergi ke proses bash saya, dan memiliki interaksi berikut:
[OP@localhost ~]$ ls
Melihat hasilnya, saya mengerti
strace: Process 2883 attached
read(0, "l", 1) = 1
write(2, "l", 1) = 1
read(0, "s", 1) = 1
write(2, "s", 1) = 1
read(0, "\r", 1) = 1
write(2, "\n", 1) = 1
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fec6b1d8e50) = 3917
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3917, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
write(1, "\33]0;OP@localhost:~\7", 23) = 23
write(2, "[OP@localhost ~]$ ", 22) = 22
...
Saya bingung pada dua baris terakhir. Tampaknya bash sedang mencoba untuk menulis dua prompt shell? Apa yang terjadi di sini?
cat
, ada dua perbedaan: ia membaca input baris demi baris, dan sementara itu gema inputnya kembali ke stdout, saya melihat input dua kali (sekali ketika saya mengetik, dan satu kali ketika kucing menggema itu).^A
(Ctrl-A) atau berbagai karakter khusus ditekan. Juga, ini mematikan gema terminal, sehingga ia dapat memutuskan apa yang akan dikeluarkan untuk setiap karakter input tertentu (sekali lagi, TAB biasanya tidak menghasilkan TAB.) Tidakcat
melakukan itu. Jika ya, coba jalankandash
, yang tidak melakukan penanganan baris perintah.read()
untuk hanya membaca satu byte pada suatu waktu adalah karena Bash tidak dapat membaca melewati baris baru. Baris baru mungkin menyebabkannya menjalankan program eksternal, yang mungkin juga membaca dari input yang sama. (Dan program yang harus dapat membaca karakter apapun setelah baris baru.) Jika tidak perlu peduli tentang itu, bisa meneleponread()
dengan batas yang lebih besar, dan dengan terminal dalam mode mentah, itu akan tetap biasanya mendapatkan input satu karakter pada suatu waktu. (Tergantung pada seberapa cepat karakter input akan tiba dan bagaimana proses dijadwalkan.)read()
buffer dengan yang lebih besar mungkin masih mengembalikan kedua baris di panggilan yang sama. Saya tidak berpikir ada jaminan yangread()
akan selalu mengembalikan hanya satu baris dalam mode yang dimasak.