Название может быть немного запутанным, поэтому позвольте мне объяснить. Я пытаюсь написать простую оболочку, чтобы практиковать свое программирование. У меня есть команда get, fork, exec loop. Однако, когда я нажимаю CTRL-C
, пока дочерний процесс все еще выполняется, моя оболочка завершает работу вместо дочернего процесса (но дочерний процесс будет работать). Вот основная функция:Как передавать сигналы дочернему процессу
int main()
{
dynarray *args; /* pointer to a dynamic array */
int bytes_read;
size_t nbytes = 0;
char *command;
pid_t pid;
printf("Enter command: ");
while ((bytes_read = getline(&command, &nbytes, stdin)) != -1) {
if (bytes_read == -1) {
perror("getline");
exit(EXIT_FAILURE);
}
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
else if (pid == 0) { /* child process */
args = newdynarray();
char *arg = strtok(command, " \n");
while (arg != NULL) {
addstring(args, arg);
arg = strtok(NULL, " \n");
}
if (args->nval == 0) {
freedynarray(args);
continue;
}
addstring(args, NULL);
char *fullpath = find_executable(args->strings[0]);
if (fullpath == NULL) {
fprintf(stderr, "Couldn't find executable: %s\n", command);
exit(EXIT_FAILURE);
}
if (execv(fullpath, args->strings) == -1) {
perror("execv");
exit(EXIT_FAILURE);
}
} else {
int status;
waitpid(pid, &status, 0);
}
printf("Enter command: ");
}
return 0;
}
У меня не было других частей, потому что я не думаю, что они актуальны. Как я могу заставить мой дочерний процесс улавливать все входные данные из stdin до тех пор, пока он не завершится?