Was ist der Unterschied zwischen Strg-z und Strg-c im Terminal?

120

Kann mir jemand den Unterschied zwischen ctrl+ zund ctrl+ sagen c?

Wenn ich im Terminal bin, stoppen beide Kombinationen den aktuellen Vorgang, aber was genau ist der Unterschied zwischen beiden?

chaitanya lakkundi
quelle
Ich habe hier eine sehr ähnliche Frage gestellt: unix.stackexchange.com/questions/116959/…
ThorSummoner
Ja, ich war erfolgreich darin, den Unterschied zwischen beiden zu verstehen.
Chaitanya Lakkundi
Eine Sache, die ich hier hinzufügen möchte, ist, dass die meisten Leute (auch in meinem professionellen Umfeld) nicht zwischen ihnen unterscheiden. Und verwendet STRG-Z-Option, um den Befehl zu beenden. Welches ist die falsche Praxis. In all diesen Fällen müssen Sie STRG-C verwenden. Als STRG-Z einfach in den Hintergrund stellen. Der Vorgang wird also erst beendet, wenn er abgeschlossen ist. Dies ist möglicherweise (meistens) kein Wunsch des Benutzers, wenn er STRG-Z drückt, um den Vorgang zu beenden.
kuldeep.kamboj

Antworten:

156

Wenn wir Randfälle beiseite lassen, ist der Unterschied einfach. Control+ Cbricht die Anwendung fast sofort ab, während Control+ Zsie im Hintergrund angehalten wird.

Die Shell sendet bei diesen Kombinationen verschiedene Signale an die zugrunde liegenden Anwendungen:

  • Control+ C(Steuerzeichen intr) sendet SIGINT, wodurch die Anwendung unterbrochen wird. In der Regel wird der Vorgang abgebrochen. Die Entscheidung liegt jedoch bei der Anwendung.

  • Control+ Z(Steuerzeichen susp) sendet SIGTSTP an eine Vordergrundanwendung und stellt es effektiv in den Hintergrund, angehalten. Dies ist nützlich, wenn Sie aus so etwas wie einem Editor ausbrechen müssen, um die benötigten Daten abzurufen. Sie können in die Anwendung zurückkehren, indem Sie ausführen fg(oder %xwo xist die Auftragsnummer, wie in gezeigt jobs).

    Wir können dies testen, indem wir laufen nano TEST, dann Control+ drücken Zund dann laufen ps aux | grep TEST. Dies zeigt uns, dass der nanoProzess noch läuft:

    oli     3278  0.0  0.0  14492  3160 pts/4    T    13:59   0:00 nano TEST
    

    Weiter können wir sehen (von diesem T, das sich in der Statusspalte befindet), dass der Prozess gestoppt wurde . Es ist also noch am Leben, aber es läuft nicht ... Es kann fortgesetzt werden.

    Einige Anwendungen stürzen ab, wenn sie über laufende externe Prozesse verfügen (z. B. eine Webanforderung), bei denen im Schlaf möglicherweise eine Zeitüberschreitung auftritt.

Oli
quelle
51
Es ist erwähnenswert, dass es auch möglich ist, eine Anwendung, die mit Strg + Z in den Vordergrund gestellt wurde, zu starten bg(anstatt fgzu deaktivieren), ohne sie wieder in den Vordergrund zu stellen. effektiv geben Sie die Kontrolle sowohl der Schale, die die Anwendung gestartet und die Anwendung selbst, als ob Sie verwendet hatte &beim Starten der Anwendung. Dies ist oft nützlich, wenn Sie vergessen haben, es mit &:) zu beginnen
Malte Skoruppa
6
Und Sie können zu diesem Vorgang zurückkehren, indem Sie fgerneut eingeben !
Sleblanc
4
Falls mehrere Jobs angehalten oder im Hintergrund sind: "Jobs" listet sie auf und "fg% n" oder "bg% n" oder sogar "kill% n", um Job% n in den Vordergrund, Hintergrund oder den Hintergrund zu stellen .
Olivier Dulac
3
@Oli: In Ihrem zweiten Absatz heißt es: "Die Shell sendet [s] ... Signale an die zugrunde liegenden Anwendungen." Nein, das Betriebssystem / der Terminal-Treiber sendet die Signale. (In einem Fenstersystem kann der Fenstermanager eine Rolle spielen.) Um die Frage zu vervollständigen (obwohl dies über den Rahmen der ursprünglichen Frage hinausgeht), möchten Sie möglicherweise Strg + \ erwähnen.
Scott
Woher weiß die Sitzung, welche Prozessgruppe nach dem Ausführen von entweder ctrl coder in den Vordergrund zurückkehren muss ctrl z? Es ist standardmäßig die SID (Bash)?
Jiggunjer
16

Control+ Zunterbricht einen Prozess ( SIGTSTP) und Control+ Cunterbricht einen Prozess ( SIGINT)

http://en.wikipedia.org/wiki/Control-Z

Auf Unix-ähnlichen Systemen ist Strg + Z die häufigste Standardtastaturzuordnung für die Tastenfolge, mit der ein Prozess angehalten wird

http://en.wikipedia.org/wiki/Control-C

In POSIX-Systemen bewirkt die Sequenz, dass das aktive Programm ein SIGINT-Signal empfängt. Wenn das Programm nicht angibt, wie mit dieser Bedingung umgegangen werden soll, wird es beendet. In der Regel wird sich ein Programm, das ein SIGINT verarbeitet, immer noch selbst oder zumindest die darin ausgeführte Task beenden

Schlafentzogener Bulbasaur
quelle
1
Gute Stellenausschreibungsreferenzen. Im Allgemeinen ist Wikipedia jedoch keine sehr gute Quelle für technische Referenzen.
Aaron
3
@ BryceAtNetwork23 das ist sehr wahr; Ich fand in diesem Fall die Wikipedia-Definition anständig ausreichend. Ich werde aber in Zukunft nach weiteren technischen Referenzen suchen!
Schlafentzug Bulbasaur
14

Ctrl+ Cwird verwendet, um einen Prozess mit einem Signal abzubrechen SIGINT, mit anderen Worten, es ist ein höflicher Abbruch .

Ctrl+ Z wird verwendet, um einen Prozess zu unterbrechen, indem es das Signal sendet SIGTSTP, das wie ein Schlafsignal aussieht, das rückgängig gemacht werden kann, und der Prozess kann wieder fortgesetzt werden.

Wenn ein Prozess angehalten wird, können wir ihn durch fg(im Vordergrund wieder aufnehmen) und bg(im Hintergrund wieder aufnehmen) wieder aufnehmen, aber ich kann einen angehaltenen Prozess nicht wieder aufnehmen, das ist ein Unterschied zwischen der Verwendung von Ctrl+ C& Ctrl+ Z.

Wie können wir angehaltene Prozesse anzeigen ?

Der jobsBefehl gibt eine Ausgabe wie folgt aus:

[1]-  Stopped                 cat
[2]+  Stopped                 vi

Wie kann ich einen angehaltenen Prozess im Hintergrund beenden?

Mit dem killBefehl:

kill %nWo nist die Zahl, die der jobsBefehl anzeigt ? Also , wenn ich will Katze töten: kill %1.

nux
quelle
1
In Übereinstimmung mit anderen Kommentaren in diesem Thread, Korrektur: ctrl-z sendet ein SIGTSTP-Signal, kein SIGSTOP.
Lukewendling
Kill% 1 sagt mir - Operation nicht erlaubt. Warum so? Vielen Dank
Satya Prakash
7

Einfach gesagt:

  • CTRL-C fordert das Programm zum Abbruch auf .

  • CTRL-Z zwingt das Programm, anzuhalten und in den Hintergrund zu treten .

    Auf diese Weise können Sie es später mit dem Befehl fortsetzen fg. Verbleibende Hintergrundaufgaben werden beendet, wenn Sie die Anmeldeshell beenden.

thomasrutter
quelle
5

Dies sollte dazu beitragen ,

Ctrl+ Zdient zum Anhalten eines Prozesses durch Senden des Signals SIGSTOP, das vom Programm nicht abgefangen werden kann. While Ctrl+ Cwird verwendet, um einen Prozess mit dem Signal SIGINT abzubrechen, und kann von einem Programm abgefangen werden, damit es sich vor dem Beenden selbst bereinigen oder gar nicht beenden kann.

Graham
quelle
4
Das ist nicht ganz richtig. Es sendet SIGTSTP, die vom Programm abgefangen werden können. Es gibt vier verschiedene Signale, die ein Programm aussetzen kann SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU. Davon SIGSTOPkönnen nur nicht gesperrt werden. Die anderen drei werden vom Terminal verwendet, um den Prozess unter verschiedenen Bedingungen zu stoppen.
Kasperd
4

Wenn Sie ctrl+ drücken c, bedeutet dies, dass Sie SIGINT an Ihren Prozess senden. wie Sie diesen Befehl eingeben: kill -SIGINT <your_pid>. Es wird Sie Ihren Prozess töten. Das ist der Grund, warum Sie es nicht sehen können, wenn Sie den Befehl ps absetzen.
Wenn Sie ctrl+ drücken z, bedeutet dies, dass Sie SIGSTOP an Ihren Prozess senden. wie Sie diesen Befehl eingeben: kill -SIGKSTOP <your_pid>. Es stoppt Ihren Prozess, aber der Prozess lebt noch. Sie können Ihren Prozess also erneut aktivieren, indem Sie SIGCONT an Ihren Prozess senden.

VERGIFTEN
quelle