Misalkan saya menjalankan cmd.exe dan ping localhost. Setelah itu saya ping localhost lagi tapi saya klik ke jendela dan ping berhenti sampai saya tekan enter .
Apa yang terjadi tepat ketika saya mengklik ke jendela? Apakah itu menunda proses atau sesuatu yang lain? Saya melampirkan tangkapan layar untuk mengklarifikasi masalah ini.
Catatan: Saya tidak benar-benar mengklik tetapi menyeret menggunakan mouse yang menciptakan kotak putih di jendela seperti yang Anda lihat pada tangkapan layar.
Sunting: klarifikasi lebih lanjut: Yang benar-benar ingin saya ketahui adalah apakah menyeret jendela menghentikan proses cmd atau tidak?
Sunting: bahkan lebih banyak klarifikasi: Saya tahu saya menggunakan Edit Cepat dan menekan enter menyalin isi yang saya pilih. Yang tidak saya ketahui adalah apa yang terjadi di latar belakang.
sumber
Jawaban:
Ketika Anda memilih beberapa teks di jendela cmd.exe, proses akan melanjutkan di latar belakang sampai waktu berikutnya ia menulis ke Output Standar (atau STDOUT, aliran data yang ditampilkan di jendela cmd.exe).
Ketika Anda keluar dari mode pemilihan, proses akan dilanjutkan seperti biasa.
Anda dapat menguji ini dengan mengetikkan
ping www.google.com -t
ke jendela cmd.exe Anda, dan memilih area keluaran. Anda akan melihatnya berhenti, dan ketika Anda membatalkan pilihan, output akan dilanjutkan.Sunting: Sesuai komentar Fran, Anda dapat menggunakan alat seperti Wireshark untuk melihat bahwa aktivitas masih terjadi setelah titik ketika Anda membuat pilihan, dan kemudian berhenti.
sumber
write()
tetapi macet.Setelah Anda mengklik ke jendela Command Prompt, host konsol tidak akan lagi mengizinkan keluaran ditulis. Aplikasi itu sendiri terus berjalan, tetapi tidak ada yang tertulis di layar.
Tentu saja, selama hanya ada satu utas, ini pada dasarnya adalah hal yang sama dengan proses Anda dibekukan. Sebagai utas tunggal mencoba untuk menulis beberapa output sebelum melakukan lebih banyak pekerjaan.
Jika saya menjalankan
ping -t localhost
dan mengklik ke jendela prompt perintah, saya kemudian dapat memeriksa tumpukan panggilan dariping.exe
utas utama dengan Process Explorer .Kita dapat melihat bahwa
ping.exe
mencoba untuk menulis beberapa keluaran. Disebutwrite()
dalam pustaka runtime C. Fungsi itu, pada titik tertentu, memanggil GetConsoleMode . Sepertinya, fungsi itu akan memeriksa apakah pengguna saat ini dalam mode tandai dan memblokir eksekusi jika diperlukan.Analisis lebih lanjut
Kami selanjutnya dapat membuktikan perilaku ini dengan memeriksa perilaku
ping
dengan WiresharkSaat menjalankan,
ping -t superuser.com
kami melihat output berikut di Wireshark:Sekarang, mari tandai kotak di command prompt.
Tiba-tiba, tidak ada lagi ping yang masuk di Wireshark.
ping
tidak lagi mengirim paket apa pun.Tapi kami sudah tahu itu...
Benar, mari kita lihat apakah outputnya benar - benar masalah di sini! Mari kita mengarahkan output ke
NUL
perangkat:Sekarang, tidak ada lagi ouput. Kami sekarang dapat menandai teks di dalam kotak sepanjang hari, paket akan login di Wireshark.
sumber
Itu karena jendela telah memasuki mode Mark. Ketika Anda menekan enter, itu menyalin teks yang dipilih ke clipboard. Sepengetahuan saya, tidak ada pengaturan untuk ini, jadi saya tidak yakin mengapa melakukan itu ketika Anda cukup mengklik ke jendela. Biasanya Anda harus mengklik kanan dan menekan "Tandai". Periksa untuk memastikan tidak ada tombol yang tersangkut di keyboard Anda.
sumber
Jendela CMD Anda dalam mode edit cepat yang secara otomatis memasuki mode edit ketika Anda mengklik layar. Enter adalah untuk menyalin teks di kotak putih dan keluar dari mode edit.
Biasanya CMD hanya memasuki mode edit ketika Anda mengklik kanan pada layar hitam dan memilih Tandai.
Untuk mengubah kembali ke normal, klik kanan pada bilah judul jendela dan pilih Properti, pilih tab Opsi dan hapus pilihan "Mode Edit Cepat" dan klik ok.
sumber
Ketika Anda memilih teks untuk disalin dari jendela (ketika di
Mark
mode) sistem menunda proses saat ini di jendela itu.Contoh file batch:
ketika ini dijalankan, segera setelah saya menandai area yang akan disalin, layar berhenti bergulir
sumber
echo blah↵%0
).:-)
Karena setiap orang telah dengan baik menunjukkan kemajuan dari output tambahan diblokir saat operasi tanda sedang berlangsung. Selain itu, baik menggunakan klik-alternatif tetikus (klik kanan secara default) atau dengan menekan tombol Enter pada keyboard Anda, Anda dapat keluar dari mode Tandai dan menyalin pilihan yang ditandai ke buffer tempel Windows. Ada jalan keluar lain dan itu adalah dengan menekan tombol Esc untuk meninggalkan menandai area layar dan melepaskan blok pada output. Ini mengasumsikan bahwa Anda memiliki mode QuickEdit yang dipilih di properti jendela perintah itu. Anda juga dapat masuk ke situasi ini dengan lebih sengaja dengan memberi tahu jendela perintah bahwa Anda ingin memilih beberapa teks.
sumber
Untuk lebih menguatkan pernyataan bahwa proses berhenti dalam "Mark mode", misalnya selama klik mouse atau seret di dalam batas jendela cmd.exe, tetapi menghentikan operasi apa pun hanya setelah benar-benar selesai dengan instance yang sedang berlangsung, saya menawarkan bukti tidak langsung:
Anda sedang melihat aliran logging instalasi Visual Studio di mana Visual Studio Setup Command Line Utility memverifikasi semua beban kerja yang diinstal.
Pada 13:26:26 saya mengklik bagian dalam jendela Command Prompt. Output to screen terhenti hingga 14:09:03 ketika saya menekan Enter untuk keluar dari "Mark mode".
Sekarang perhatikan bahwa setelah 13:26:26, proses selesai untuk memeriksa hash x86-23_r20.zip, pesan " berhasil. Hash: X " dan mulai kembali dengan file lain pada 14:09:03, pesan " BEGIN: Memverifikasi" [..] AndroidSDKPrivateInstall.ps1 "
Selama jeda Visual Studio Setup Command Line Utility menyelesaikan verifikasi file yang sedang diproses, dan tepat pada saat kontrol akan dikembalikan ke konsol, memulai pekerjaan pemeriksaan hash baru.
sumber