gpt4 book ai didi

c - 迷你 shell 项目中的信号处理程序

转载 作者:行者123 更新时间:2023-11-30 17:09:37 24 4
gpt4 key购买 nike

这就是我的信号处理程序中发生的情况。 signal_flag也是一个全局变量。

volatile sig_atomic_t signal_flag = 0;
void sig_handler(int signo) {
if (signo == SIGTSTP) {
signal_flag = 1;
}
}

只要我的 fork() 按预期工作,就会发生这种情况。我将 sleep 设置为 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 信号的情况下就会发生这种情况。有什么想法或指南吗?

最佳答案

您似乎没有检查 if (i==12) 中 fork() 的结果。在 fork 之后安装信号处理程序也是一个等待发生的问题..

关于c - 迷你 shell 项目中的信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33212144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com