cmdのウィンドウをクリックした場合、正確にはどうなりますか?


45

cmd.exeを実行し、localhostにping を実行するとします。その後、再度localhostにpingを送信しますが、ウィンドウをクリックすると、Enterを押すまでpingが停止します

ウィンドウをクリックするとどうなりますか?プロセスまたは他の何かを中断しますか?この問題を明確にするためにスクリーンショットを添付しました。

注:実際にクリックするのではなく、マウスを使用してドラッグすると、スクリーンショットに示されているように、ウィンドウ内に白いボックスが作成されます。

編集:さらに明確化:私が本当に知りたいのは、ウィンドウをドラッグするとcmdプロセスが停止するかどうかです。

編集:さらに明確化:クイック編集を使用しており、Enterキーを押すと選択したコンテンツがコピーされることを知っています。私が知らないのは、バックグラウンドで何が起こるかということです。

ここに画像の説明を入力してください


2
ところで、あなたはこの動作が変更を取得し、ユーザーボイスに投票することができますwpdev.uservoice.com/forums/...
カール・ウォルシュ

いいね 私はそれに投票しました。
アダムアロルド

投票はちょうど404ページに私を取っている
ケリー・バン

1
さらに重要なことは、このひどい機能を無効にする方法です。stackoverflow.com/a/37578608/463967
アランマクドナルド

回答:


27

cmd.exeウィンドウでテキストを選択すると、次に標準出力(またはSTDOUT、cmd.exeウィンドウに表示されるデータストリーム)に書き込むまで、プロセスはバックグラウンドで実行されます。

選択モードを終了すると、プロセスは通常どおり再開されます。

これをテストするping www.google.com -tには、cmd.exeウィンドウに入力して、出力の一部の領域を選択します。一時停止し、選択を解除すると出力が再開されます。

編集: Franのコメントによると、Wiresharkなどのツールを使用して、選択した時点以降もアクティビティが発生し、その後停止することを確認できます。


3
それだけではテストされません。Wiresharkを実行して、ICMPパケットの送信が停止するかどうかを確認する必要もあります。その場合、プロセスが中断されるのは正しいことです。そうでない場合、プロセスは中断されず、出力は単にバッファリングされます(バッファがいっぱいになるまで、それは中断されるか、データが失われます)。
フラン

1
@Franが正しいと確信しています-選択モードで十分に長く待っていた場合、大量の出力が一度に表示されませんか?
イズカタ

1
これは非常にイライラしましたが、cmdウィンドウのプロパティに移動すると、「クイック編集モード」の選択を解除でき、ウィンドウ内をクリックしても選択モードにならないことがわかりました。
Zitrax

2
@Zitraxはい、そうすることで偶発的にこれを防ぐことができます。コマンドウィンドウから頻繁にコピーするので、そうしません。(実際、私はその問題のないConsolezを使用しています)
-JohnL

1
これは「ブロッキング」と呼ばれます。つまり、アプリケーションは呼び出しますwrite()が、スタックします。
Attie

50

コマンドプロンプトウィンドウをクリックすると、コンソールホストは出力の書き込みを許可しなくなります。アプリケーション自体は実行され続けますが、画面には何も書き込まれません。

もちろん、スレッドが1つだけである限り、これは基本的にプロセスを凍結するのと同じことです。シングルスレッドは、さらに作業を行う前に出力を書き込もうとします。

実行ping -t localhostしてコマンドプロンプトウィンドウをクリックするとping.exeProcess Explorerを使用してメインスレッドの呼び出しスタックを検査できます。

ここに画像の説明を入力してください

ping.exe何らかの出力を書き込もうとしたことがわかります。write()Cランタイムライブラリで呼び出しました。その関数は、ある時点でGetConsoleModeを呼び出します。どうやら、その関数は、ユーザーが現在マークモードになっているかどうかを確認し、必要に応じて実行をブロックします。

さらなる分析

私たちは、のふるまい調べることによって証明この動作を促進することができますpingWiresharkのを

実行ping -t superuser.comすると、Wiresharkに次の出力が表示されます。
ここに画像の説明を入力してください

次に、コマンドプロンプトでボックスをマークします。
ここに画像の説明を入力してください
突然、Wiresharkにpingが記録されなくなりました。pingパケットを送信しなくなりました。

しかし、私たちはすでにそれを知っていました...

右、出力が実際に問題であるかどうかを見てみましょう!出力をNULデバイスに送信しましょう:

ここに画像の説明を入力してください

これで、出力はなくなりました。ボックス内のテキストを1日中マークできるようになりました。パケットはWiresharkに記録されます。

ここに画像の説明を入力してください


元の回答に対して+1していなかった場合、「さらなる分析」のために今+1します
-JohnL

6

これは、ウィンドウがマークモードに入ったためです。Enterキーを押すと、選択したテキストがクリップボードにコピーされます。私の知る限り、この設定はありません。したがって、ウィンドウをクリックするだけで、なぜそれを行うのかわかりません。通常、右クリックして「マーク」を押す必要があります。キーボードにキーが残っていないことを確認してください。


そして、「マークモード」は何をしますか?プロセスを一時停止しますか?
アダムアロルド

マークモードは、コマンドウィンドウからテキストをコピーするために使用されます。唯一の用途である私の知る限り、他にもあると思います。
ギャレット

7
この設定はクイック編集モードと呼ばれます。左上のアイコンをクリックし、[プロパティ]を選択し、[オプション]タブで[クイック編集モード]を選択します。私が知っていることから、プロセスは、コンソールと対話する必要があるまでバックグラウンドで続行され、その時点でブロックされます
-JohnL

あなたのコメントは私が探しているものですので、@ JohnLは答えを作成してください。
アダムアロルド

@edem回答を追加しました:)
JohnL

6

CMDウィンドウは、画面をクリックすると自動的に編集モードに入るクイック編集モードになっています。Enterは、ホワイトボックス内のテキストをコピーし、編集モードを終了するためのものです。

通常、CMDは黒い画面を右クリックして[マーク]を選択した場合にのみ編集モードに入ります。

通常に戻すには、ウィンドウのタイトルバーを右クリックして[プロパティ]を選択し、[オプション]タブを選択して[クイック編集モード]の選択を解除して[OK]をクリックします。


3

ウィンドウからコピーするテキストを選択しているとき(Markモードのとき)、システムはそのウィンドウの現在のプロセスを一時停止します。

バッチファイルの例:

:test
echo %0
goto test

これを実行すると、コピーする領域をマークするとすぐに、画面のスクロールが停止します


私はまったく同じことを投稿しようとしていました(ただし、バッチファイルはでしたecho blah↵%0)。:-)
Synetech

1

誰もが非常にうまく指摘しているように、マーク操作の進行中は追加出力の進行がブロックされます。また、マウスの代替クリック(デフォルトでは右クリック)を使用するか、キーボードのEnterキーを押すことにより、マークモードを終了し、マークした選択をWindowsの貼り付けバッファーにコピーできます。別の方法があります。それは、Escキーを押して、画面領域のマーキングを中止し、出力時にブロックを解放することです。これは、そのコマンドウィンドウのプロパティでQuickEditモードが選択されていることを前提としています。また、コマンドウィンドウにテキストを選択するように指示することで、この状況にさらに慎重に取り組むことができます。


0

マウスのクリックやcmd.exeウィンドウの境界内でのドラッグなどでプロセスが「マークモード」で一時停止するが、進行中のインスタンスが完全に終了した後にのみ操作を停止するというステートメントをさらに確証するために、間接的な証拠を提供します:

[1378:000f][2018-10-08T13:26:20] END: Verifying package "AndroidEmulator,version=26.0.0.2"
[1378:000f][2018-10-08T13:26:20] BEGIN: Verifying package "AndroidImage_ARM_API23,version=20.0.0.3"
[1378:000f][2018-10-08T13:26:20] Verifying package 'AndroidImage_ARM_API23,version=20.0.0.3'
[1378:000c][2018-10-08T13:26:26] SHA256 verification for 'AndroidImage_x86_API23,version=20.0.0.3\x86-23_r20.zip' succeeded. Hash: X
[1378:0025][2018-10-08T14:09:03] BEGIN: Verifying "AndroidImage_ARM_API23,version=20.0.0.3\AndroidSDKPrivateInstall.ps1"
[1378:0012][2018-10-08T14:09:03] BEGIN: Verifying "AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip"
[1378:0012][2018-10-08T14:09:03] Authenticode verification returned 0x800b0003 for path: AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip.
[1378:0012][2018-10-08T14:09:03] Retrying validation for: AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip
[1378:000c][2018-10-08T14:09:03] Authenticode verification returned 0x800b0003 for path: AndroidImage_x86_API23,version=20.0.0.3\x86-23_r20.zip.

Visual Studioセットアップコマンドラインユーティリティがインストールされているすべてのワークロードを検証しているVisual Studioインストールのログストリームを見ています。

13:26:26に、コマンドプロンプトウィンドウ内をクリックしました。画面への出力は、「マークモード」を終了するためにEnterキーを押すと、14:09:03まで停止します。

13:26:26の後、プロセスが終了してx86-23_r20.zipハッシュ、メッセージ「success。Hash :X」の確認が終了し、14 09 03に別のファイルで再起動し、メッセージ「BEGIN: Verifying [..] AndroidSDKPrivateInstall.ps1 "

一時停止中に、Visual Studioセットアップコマンドラインユーティリティは処理中のファイルの検証を終了し、コントロールがコンソールに返されるまさにその時点で、新しいハッシュチェック作業を開始しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.