Я подозреваю, что главная проблема в том, что вы не останавливаете дочерний процесс. Например, после того, как вы введете один раз CREATE, дочерний процесс напечатает CHILD PROCESS, но продолжит цикл в своем собственном процессе, в то время как родитель делает то же самое.
Вы должны убедиться, что дочерний процесс завершается после выполнения чего-то значимого. Кроме того, как отмечалось выше Chrono Kitsune, родительский процесс должен wait()
, чтобы дочерний процесс получил свой статус выхода и предотвратил зомби.
Кроме этого, ваш пользовательский буфер ввода составляет 100 символов, открывая вашу программу для буферизации атак переполнения. Но это другая история.
Ваш код, слегка переработанный, который, я думаю, делает то, что вы хотите:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
int main() {
char user_input[100];
int this_pid;
while (1) {
//receive user_input
scanf("%s", user_input);
printf("INPUT: %s\n", user_input);
if(strcmp(user_input, "CREATE") == 0){
printf("CALLED_CREATE\n");
if((this_pid = fork()) < 0){
perror("Failed to fork process");
return EXIT_FAILURE;
}
//child
if (this_pid == 0){
printf("CHILD_PROCESS\n");
// do some interesting stuff here, and then don't forget to
exit(0);
}
}
if(strcmp(user_input, "QUIT") == 0)
break;
}
}