c - 在我的自定义 shell 中使用 & 功能后 ctrl-c 不起作用
问题描述
我正在尝试在我正在构建的自定义 shell 中编写背景功能。(例如 & 选项,如:echo hello &)
当我生成前台进程时一切正常,但是在生成后台进程后,当按下 ctrl-c 时,我的 shell 程序不会终止。
这是我的代码中负责将新进程作为后台/前台运行的部分:
struct cmd* c=parsecmd(buf);
pid_t pid;
signal(SIGTTOU,SIG_IGN);
if((pid=fork1()) == 0){
pid=getpid();
setpgid(pid,pid);
if((c->type & 0x100)==0)//if forground
tcsetpgrp(0,pid);
signal(SIGTTOU,SIG_DFL);
runcmd(c);
}
setpgid(pid,pid);
if((c->type & 0x100)==0){
tcsetpgrp(0,pid);
wait(&r);
tcsetpgrp(0,getpgid(getpid()));
}
//printf("my pgid is %d and the forground pgid is %d\n",getpgid(getpid()),$
signal(SIGTTOU,SIG_DFL);
这是我运行它时得到的结果:
6.828$ echo hello &
6.828$ hello
6.828$ ^C
6.828$
有人可以帮我弄清楚我的错误是什么吗?
另外我应该说,当我在生成后台进程后立即使用 ctrl-c 时。不起作用的事情是当我输入 enter 并编写 ctrl-c 然后即使我将继续生成其他命令(前景或背景)它也不会起作用。当我在生成前景后输入 enter 时它工作得很好。过程(和
解决方案
推荐阅读
- laravel - 提供的应用 ID 看起来不像是有效的应用 ID。拉拉维尔
- azure-devops - 未找到 ILMerge 任务 - Azure DevOps Build Pipeline
- aspnetboilerplate - 有没有办法通过实体历史获取实体的所有更改?
- vba - 如果符合某些条件,VBA 在变量前添加一个数字
- r - 将栅格转换为点形状文件
- python - 如果 Scrapy Spider 的条件
- ruby - 域对象是否应该由事件处理程序聚合创建
- jquery - 当表格单元格太长时,有什么方法可以减少表格单元格中的文本?
- c# - ASP.net web 方法,重写 URL
- c# - 正则表达式在带引号的括号之间获取字符串