Fix some return value and signal handling related to pipes
This commit is contained in:
parent
d5eba9b546
commit
06ff00fd41
12
apps/sh.c
12
apps/sh.c
@ -724,6 +724,9 @@ static void handle_status(int ret_code) {
|
|||||||
case SIGINT:
|
case SIGINT:
|
||||||
/* Do nothing */
|
/* Do nothing */
|
||||||
return;
|
return;
|
||||||
|
case SIGPIPE:
|
||||||
|
/* Do nothing */
|
||||||
|
return;
|
||||||
default:
|
default:
|
||||||
sprintf(str, "Killed by unhandled signal %d",WTERMSIG(ret_code));
|
sprintf(str, "Killed by unhandled signal %d",WTERMSIG(ret_code));
|
||||||
break;
|
break;
|
||||||
@ -1112,6 +1115,7 @@ _nope:
|
|||||||
tokenid = i;
|
tokenid = i;
|
||||||
|
|
||||||
unsigned int child_pid;
|
unsigned int child_pid;
|
||||||
|
int last_child;
|
||||||
|
|
||||||
int nowait = (!strcmp(argv[tokenid-1],"&"));
|
int nowait = (!strcmp(argv[tokenid-1],"&"));
|
||||||
if (nowait) {
|
if (nowait) {
|
||||||
@ -1144,7 +1148,8 @@ _nope:
|
|||||||
last_output[1] = tmp_out[1];
|
last_output[1] = tmp_out[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fork()) {
|
last_child = fork();
|
||||||
|
if (!last_child) {
|
||||||
if (output_files[cmdi]) {
|
if (output_files[cmdi]) {
|
||||||
int fd = open(output_files[cmdi], file_args[cmdi], 0666);
|
int fd = open(output_files[cmdi], file_args[cmdi], 0666);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
@ -1180,6 +1185,7 @@ _nope:
|
|||||||
}
|
}
|
||||||
run_cmd(arg_starts[0]);
|
run_cmd(arg_starts[0]);
|
||||||
}
|
}
|
||||||
|
last_child = child_pid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1188,8 +1194,10 @@ _nope:
|
|||||||
if (!nowait) {
|
if (!nowait) {
|
||||||
child = child_pid;
|
child = child_pid;
|
||||||
int pid;
|
int pid;
|
||||||
|
int tmp;
|
||||||
do {
|
do {
|
||||||
pid = waitpid(-1, &ret_code, 0);
|
pid = waitpid(-1, &tmp, 0);
|
||||||
|
if (pid == last_child) ret_code = tmp;
|
||||||
} while (pid != -1 || (pid == -1 && errno != ECHILD));
|
} while (pid != -1 || (pid == -1 && errno != ECHILD));
|
||||||
child = 0;
|
child = 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user