И это всё МОЁ

непоняная для меня картина случается когда выполняется код:

#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, а никакой процесс не помер, то waitpid не впадет в ожидание.


Откуда SIGCHLD если никакой процесс не умер и почему это случается когда использую fork() до popen?








 , ,