这是我的信号处理程序中发生的事情。 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);
}
我将shell作为家庭作业的一部分,我要求处理SIGTSTP信号,当用户按下CTRL + Z时,我的shell将暂停正在进行的过程(我有设置sleep(3)所以我可以暂停一个简单的ls -al
进程
我的问题是我的代码通过insert_suspended_process(pid_t)
函数将带有该pid的进程添加到我的列表中,但是没有按下CTRL + Z信号就会发生这种情况。任何想法或quidelines?
答案 0 :(得分:0)
你似乎没有在if(i == 12)中检查fork()的结果。在fork之后安装信号处理程序是一个等待发生的问题..