Fix some return value and signal handling related to pipes

This commit is contained in:
K. Lange 2018-10-02 22:36:57 +09:00
parent d5eba9b546
commit 06ff00fd41

View File

@ -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;
} }