1. Przed pętlą, w której się forkujesz powinieneś zablokować sygnał SIGCHLD i odblokowujesz go dopiero po wyjściu z while, czekające na procesy, a ten while ma wyglądać w następujący spoób: if(ifBack == 0){ while(chCounter){ sigsuspend(&mask); } } gdzie ifBack oznacza czy działay w backgroundzie czy też nie. 2. Blokujące sycall mogą być przerywane sygnałami dlatego trzeba je wznowić. 3. Musisz napisać handler, mniej więcej tak: void handler(int sig_nb){ //write(1, "jestem handler\n", 15); pid_t ch = (pid_t)1; int c; //printf("%d\n",sig_nb); int* stat; while(ch > 0){ int *res; ch = waitpid(-1, NULL, WNOHANG); // printf("%d\n", ch); if(ch > 0){ if(ifInForeground(ch)) chCounter--; else{ sprawdz z jakim kodem się zakończył oraz dopisz do structury rezultatów wynik. } } } } Ta struktura wyników ma mieć stały rozmiar i jeżeli już więcej danych się do niej nie zmieści to się nie musisz przejmować i nie dopisywać więcej. 4. Jeszcze coś z tym SIGINT'em trzeba zrobić i chyba zablokować go w mshellu a odblokować u dzieci, które są w foregroundzie. Plus dzieciom z backgroundu zakładasz nowy ród: setsid(), żeby sigint ich nie zabił