dd: fix skip= parse error (spotted by Dirk Clemens <develop@cle-mens.de>)
This commit is contained in:
@@ -2,8 +2,12 @@ strace of "sleep 1 | sleep 2" being run from interactive bash 3.0
|
||||
|
||||
|
||||
Synopsis:
|
||||
open /dev/tty [, if fails, open ttyname(0)]; close /* helps re-establish ctty */
|
||||
get current signal mask
|
||||
install default handlers for GHLD QUIT TERM
|
||||
TCGETS on fd# 0
|
||||
TCGETS on fd# 2 /* NB: if returns ENOTTY (2>/dev/null), sh seems to disable job control,
|
||||
does not show prompt, but still executes cmds from fd# 0 */
|
||||
install default handlers for CHLD QUIT TERM
|
||||
install common handler for HUP INT ILL TRAP ABRT FPE BUS SEGV SYS PIPE ALRM TERM XCPU XFSZ VTALRM USR1 USR2
|
||||
ignore QUIT
|
||||
install handler for INT
|
||||
@@ -34,11 +38,73 @@ get our pprocess group
|
||||
signal followed by a SIGCONT signal will be sent to each process
|
||||
in the newly-orphaned process group.
|
||||
...
|
||||
|
||||
dup stderr to fd# 255
|
||||
move ourself to our own process group
|
||||
block CHLD TSTP TTIN TTOU
|
||||
set tty's (255, stderr's) foreground process group to our group
|
||||
allow all signals
|
||||
mark 255 CLOEXEC
|
||||
set CHLD handler
|
||||
get signal mask
|
||||
get fd#0 flags
|
||||
get signal mask
|
||||
set INT handler
|
||||
block CHLD TSTP TTIN TTOU
|
||||
set fd #255 foreground process group to our group
|
||||
allow all signals
|
||||
set INT handler
|
||||
block all signals
|
||||
allow all signals
|
||||
block INT
|
||||
allow all signals
|
||||
lotsa sigactions: set INT,ALRM,WINCH handlers, ignore TERM,QUIT,TSTP,TTOU,TTIN
|
||||
block all signals
|
||||
allow all signals
|
||||
block all signals
|
||||
allow all signals
|
||||
block all signals
|
||||
allow all signals
|
||||
read "sleep 1 | sleep 2\n"
|
||||
block INT
|
||||
TCSETSW on fd# 0
|
||||
allow all signals
|
||||
lotsa sigactions: set INT,ALRM,WINCH handlers, ignore TERM,QUIT,TSTP,TTOU,TTIN
|
||||
block CHLD
|
||||
pipe([4, 5]) /* oops seems I lost another pipe() in editing... */
|
||||
fork child #1
|
||||
put child in it's own process group
|
||||
block only CHLD
|
||||
close(5)
|
||||
block only INT CHLD
|
||||
fork child #2
|
||||
put child in the same process group as first one
|
||||
block only CHLD
|
||||
close(4)
|
||||
block only CHLD
|
||||
block only CHLD TSTP TTIN TTOU
|
||||
set fd# 255 foreground process group to first child's one
|
||||
block only CHLD
|
||||
block only CHLD
|
||||
block only CHLD
|
||||
wait4 for children to die or stop - first child exits
|
||||
wait4 for children to die or stop - second child exits
|
||||
block CHLD TSTP TTIN TTOU
|
||||
set fd# 255 foreground process group to our own one
|
||||
block only CHLD
|
||||
block only CHLD
|
||||
block nothing
|
||||
--- SIGCHLD (Child exited) @ 0 (0) ---
|
||||
wait for it - no child (already waited for)
|
||||
sigreturn()
|
||||
read signal mask
|
||||
lotsa sigactions...
|
||||
read next command
|
||||
|
||||
|
||||
execve("/bin/sh", ["sh"], [/* 34 vars */]) = 0
|
||||
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
|
||||
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
|
||||
ioctl(2, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
|
||||
rt_sigaction(SIGCHLD, {SIG_DFL}, {SIG_DFL}, 8) = 0
|
||||
rt_sigaction(SIGQUIT, {SIG_DFL}, {SIG_DFL}, 8) = 0
|
||||
rt_sigaction(SIGTERM, {SIG_DFL}, {SIG_DFL}, 8) = 0
|
||||
|
||||
Reference in New Issue
Block a user