непоняная для меня картина случается когда выполняется код:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
static void sig_chld_handler() {
int status;
wait(&status);
//waitpid(-1, &status, WNOHANG);
}
void signals_init() {
signal(SIGCHLD, sig_chld_handler);
}
void bash_cmd(char* cmd_str) {
FILE* fp;
const int buflen = 1024;
char buf[buflen];
if(!(fp = popen(cmd_str, "r"))) {
fprintf(stderr, "\npopen error\n");
return;
}
while( fgets(buf, buflen - 1, fp) ) {
fprintf(stderr, "\n%s", buf);
}
pclose(fp);
}
int main(void) {
signals_init();
pid_t pid = fork();
if(!pid) {
execl("/bin/sleep", "sleep", "1000", (char*)NULL);
exit(EXIT_SUCCESS);
}
while(1) {
bash_cmd("pwd");
sleep(1);
}
return EXIT_SUCCESS;
}
Примерно на 3-10-й итерации цикла popen прилетает SICHLD и wait входит в ожидание. Если я не делаю execl(...) в форке, то wait ведет себя нормально.
Вместо wait стал использовать
waitpid(-1, &status, WNOHANG);
Откуда SIGCHLD если никакой процесс не умер и почему это случается когда использую fork() до popen?