如何实现shell的作业控制
How to implement job-control of shell
大家好,我正在使用c++实现linux的shell,但是我在信号方面有一些问题。
这是我的shell的基本逻辑,这是伪代码,但你可以很容易地知道我想做什么。
signal_handler(int sig){
switch(sig){
case SIGINT: ... break;
case SIGTSTP: ... break;
}
}
main{
signal(SIGINT,SIG_IGN);
signal(SIGTSTP, SIG_IGN);
what main process do{
wait(&child_pid);
}
what child process do{
signal(SIGINT, signal_handler);
signal(SIGTSTP, signal_handler);
}
}
现在我正在使用wait(&fpid)
来等待子进程的终止。但是现在我想做一个作业控制功能…我应该为waitpid编码什么样的信号?
我用SIG_IGN
来让这个shell的主进程忽略ctrl-c
和ctrl-z
信号,即SIGINT
和SIGTSTP
。
您需要为主进程创建一个signal_handler,它可以接受ctrl-c
和ctrl-z
信号,然后将信号传递给子进程。
这意味着主进程和子进程的信号处理程序应该不同。
相关文章:
- 如何通过cpp程序运行shell脚本
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 控制允许动态运行c++的并发操作数
- 从控制台中删除最后打印的元素
- 是否可以使用if constexpr删除控制流语句
- 将执行、作业和WinAPI相乘
- 无法在windows控制台中为C++程序提供必要的输入
- shell排序中的交换和比较
- 为什么我的多线程作业队列崩溃
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 使用"Task"函数指针队列定义作业管理器
- C++秘密消息学校作业
- 动态类的分段错误(家庭作业问题)
- 控制到达非空函数clang(-Wreturn-type)的末尾
- 查找 GCD:并非所有控制路径都返回值
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- CMAKE:动态作业池更改
- 通过 API 控制 DJI 相机
- 如何在没有嵌套作业对象的情况下可靠地控制子进程生存期
- 如何实现shell的作业控制