What's different between Ctrl+Z and Ctrl+C in Unix command line?

191

124

I'm using Mac OS X Terminal. And I use Ctrl+Z or Ctrl+C to stop some programs. But I realized that I don't know what they're exactly doing. What are they and what's the difference between them?

This question was a Super User Question of the Week.
Read the March 13, 2011 blog entry for more details or submit your own Question of the Week.

Eonil

Posted 2011-03-27T00:39:57.177

Reputation: 4 206

Answers

255

Control+Z is used for suspending a process by sending it the signal SIGSTOP, which cannot be intercepted by the program. While Control+C is used to kill a process with the signal SIGINT, and can be intercepted by a program so it can clean its self up before exiting, or not exit at all.

If you suspend a process, this will show up in the shell to tell you it has been suspended:

[1]+  Stopped                 yes

However, if you kill one, you won't see any confirmation other than being dropped back to a shell prompt. When you suspend a process, you can do fancy things with it, too. For instance, running this:

fg

With a program suspended will bring it back to the foreground.

And running the command

bg

With a program suspended will allow it to run in the background (the program's output will still go to the TTY, though).

If you want to kill a suspended program, you don't have to bring it back with fg first, you can simply do the command:

kill %1

If you have multiple suspended commands, running

jobs

will list them, like this:

[1]-  Stopped                 pianobar
[2]+  Stopped                 yes

Using %#, where # is the job number (the one in square brackets from the jobs output) with bg, fg, or kill, can be used to do the action on that job.

Wuffers

Posted 2011-03-27T00:39:57.177

Reputation: 16 645

2@adityamenon Find the executable name, for example amarok and run killall amarok, or run ps aux and find the process id next to the executable name and run kill {process id}. – Bruno Finger – 2016-03-10T11:12:53.420

3You can change which keys do which job by using the stty command. For example stty susp ^Z or stty intr ^C. – RedGrittyBrick – 2011-03-27T12:08:22.387

7Actually, it sends SIGTSTP, which can be intercepted. – Simon Richter – 2011-03-28T07:28:21.263

2Cool! So if a program is refusing to die with Ctrl+C how do you force kill it? – Aditya M P – 2013-10-05T07:05:50.457

22

Ctrl+Z suspends the process with SIGTSTP, you can resume it later. Ctrl+C kills the process with SIGINT, which terminates the process unless it is handled/ignored by the target, so you can't resume it. There's also a SIGSTOP which can be sent by kill() and which the process can't intercept. SIGCONT is the counterpart to both SIGSTOP and SIGTSTP that un-suspends the process.

Ben Voigt

Posted 2011-03-27T00:39:57.177

Reputation: 6 052

No, that's SIGTSTP, not SIGSTOP and it can be intercepted. – sch – 2013-10-01T21:28:35.990

@sch, is that correct now? – Ben Voigt – 2013-10-01T21:48:54.877

Yes, though Ctrl-Z (and CTRL-C) causes a process group (the foreground process group of the terminal) to receive that signal, not necessarily only one process. Also note SIGTTIN and SIGTTOU sent to processes not in the foreground process group of the terminal when then attempt to read or write from/to it, that also suspend them. – sch – 2013-10-01T22:00:58.210

@sch: Isn't the process vs group only a difference in how the signal is sent? IIRC kill() lets you send SIGSTOP to a group just fine. – Ben Voigt – 2013-10-01T22:03:08.083

Yes, my command was about your CTRL-Z suspends the process... which may mislead people into thinking it is sent to just one process when it's actually a job or process group. – sch – 2013-10-01T22:05:49.313

18

CTRL+Z stops (pauses) a job

CTRL+C terminates a job

with CTRL+C you cannot resume the process but with CTRL+Z the job can be resumed by just entering at the command promt:

fg %1

if you have multiple processes paused then you should do

jobs

to see the output and select the appropriate number to resume e.g.

fg %3

resumes the third job in the list. You can also have jobs running in the background with

bg %n

where n is the job number.

g24l

Posted 2011-03-27T00:39:57.177

Reputation: 829

That's jobs (process groups), not processes that CTRL-C, CTRL-Z, fg and bg deal with. – sch – 2013-10-01T22:03:30.707

3

Cntrl + Z pause the currently running process. 

And

Cntrl + C simply terminates the running process.

Using Cntrl + C you can not resume the process. where as using Cntrl + Z you can resume the process.

use fg %1 to resume the process.

Ravindra Miyani

Posted 2011-03-27T00:39:57.177

Reputation: 31

3

CTRL+Z stops (pauses) a job

CTRL+C terminates a job

With CTRL+C you cannot resume the process, but with CTRL+Z the job can be resumed by just entering at the command prompt:

fg %1

If you have multiple processes paused then you should do

jobs

to see the output.

abul

Posted 2011-03-27T00:39:57.177

Reputation: 31

2

The previous answers are correct, but for some unknown reason Ctrl-Z suspends all child processes as well, but killall -SIGSTOP ... only suspends the frontmost (parent) process and leaves the children to run as they like.

Kostas

Posted 2011-03-27T00:39:57.177

Reputation: 121