Это то, что происходит в моем обработчике сигналов. Также signal_flag является глобальной переменной.Обработчики сигналов в проекте мини-оболочки
volatile sig_atomic_t signal_flag = 0;
void sig_handler(int signo) {
if (signo == SIGTSTP) {
signal_flag = 1;
}
}
Это условие, которое возникает, если моя функция fork() работает как предполагается. У меня есть спящий режим, равный 5, поэтому у меня достаточно времени, чтобы нажать CTRL + Z после команды, которую я дам в качестве ввода, и приостановить процесс.
pid_t child_pid = fork();
int status;
//GOT A SIGNAL.
if (signal(SIGTSTP, sig_handler) != SIG_ERR) {
signal(SIGTSTP, SIG_IGN);
kill(child_pid, SIG_IGN);
insert_suspended_process(child_pid, ACTIVE);
//_exit(EXIT_SUCCESS);
}
if (child_pid < 0) {
fprintf(stderr, "execute: fork failed.\n");
exit(EXIT_FAILURE);
}
if (child_pid == 0) {
/* child process. */
//print_child_messages();
char bin[512];
strcpy(bin, command[0]);
//strcat(bin, command[0]);
if (bars > 0) {
//Houston, we have pipes, I REPEAT, WE HAVE PIPES!
int pipefd[2], status;
pid_t cpid;
if (pipe(pipefd) == -1) {
fprintf(stderr, "execute: pipe failed.\n");
exit(EXIT_FAILURE);
}
cpid = fork();
pipe(pipefd);
}
sleep(3);
//executing...
execvp(bin, command);
_exit(EXIT_SUCCESS); //safer than exit().
}
else {
/* parent process. */
//print_parent_messages(child_pid);
//signal(SIGTSTP, SIG_IGN);
waitpid(child_pid, NULL, 0);
}
Делаю оболочку как часть домашней работы, и я просил, чтобы обрабатывать сигнал SIGTSTP таким образом, что, когда пользователь нажимает CTRL + Z моя оболочка будет приостановить текущий процесс (я есть set sleep (3), поэтому я могу приостановить даже простой процесс ls -al
) Моя проблема заключается в том, что мой код добавляет процесс с этим pid в мой список через функцию insert_suspended_process(pid_t)
, но это происходит без меня, нажимая на сигнал CTRL + Z. Любые мысли или вопросы?
Вы должны были объявить 'volatile sig_atomic_t signal_flag = 0;'; также скомпилируйте все предупреждения и информацию об отладке ('gcc -Wall -Wextra -g'), ** используйте отладчик ** (' gdb'), а также 'strace' &' valgrind' –