Control C not working (sh in initrd after PXE boot)

Sep 23, 2009 2 Replies

Hi.



I boot my embedded target with PXE, using my own initrd. The init script launches a sh. Everything works fine.



The only issue is that the Control C has no effect. So I have no way to kill a running command (e.g ping...)



The stty looks OK (intr = ^C) The keys like ^Q, ^D, ^S work fine.



Is it because the signal is blocked ? Any idea how to make Ctrl C work ?



Thanks



Chris


For ctrl-c to work, you need a controlling terminal (the TTY column) and a process group. If you have a '?' in the TTY column, ctrl-c won't work. In the past I have seen this happen because of this code in drivers/char/tty_io.c: if (device == SYSCONS_DEV) { struct console *c = console_drivers; while(c && !c->device) c = c->next; if (!c) return -ENODEV; device = c->device(c); filp->f_flags |= O_NONBLOCK; /* Don't let /dev/console block */ noctty = 1; }

Note that O_NOCTTY (no controlling terminal) is forced on whenever /dev/console is opened (noctty = 1). Possible workarounds: 1) Run getty on something other than /dev/console. For example, if you console is on the first serial port, run getty on /dev/ttyS0. I believe this is the "correct" answer. 2) You could also change getty to do a TIOCSCTTY ioctl explicitly after it has opened the terminal. 3) You could remove the forcing of noctty on from tty_io.c

Christ> Hi.

Hi.

In fact, I had no /dev/tty. I made a little mknod and now CtrlC is back :)

Thanks for you answer.

Chris

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required