引
OS实验课实验一,仅做学习用,仅供参考,本文记录一些心得
github:https://github.com/LeviningU/LinuxShell-ysh
jobs fg bg ctrl+z ctrl+c ctrl+\ &
进程管理,创建子进程,算是第二次接触多线程(菜)
命令 加个 &,后台运行,输出会在前台显示
jobs:查看进程
fg:将后台进程放到前台运行
ctrl+z:将前台命令暂停
bg:将暂停的进程在后台继续运行
ctrl+c:中止前台进程
ctrl+\:另一种中止(?)未过多了解
管道与重定向
管道命令其实也相当于重定向命令,都是将改变命令的标准输入流和标准输出流
重定向命令
“>”:将标准输出流输出到一个文件中,覆盖原内容
“>>”:将标准输出流输出到一个文件中,追加到原内容后
“<”:将标准输入流更改为一个文件
管道命令
“|”:此符号连接的左右两条命令,左边命令的输出流会输出到右边命令的输入流(当然并不是直接接上)(常用于xxx | grep获取某些命令输出中想要的信息),可以重复接管道。
知道以上两个东东之后就可以玩花活了(bushi cat < main.cpp | cat > main.cpp )古希腊掌控输入输出的神。
信号机制以及带来的问题和个人处理方式
可以为指定的中断设置处理函数,比如前面提到的ctrl+z,ctrl+c中断,
可以捕获该中断自己处理,当然也可以忽略
接收到这些信号时,程序会停下当前语句的执行,去执行信号处理函数,然后从停下的位置的下一条命令(问题的开始,命运的齿轮开始转动)开始执行。这很好对吧,不这不好。
在正常的程序运行中,有两个地方,第一个地方是前台命令执行时,父进程等待子进程时的waitpid,第二个地方是等待用户输入时的getline,当程序在这两个地方等待时,收到中断信号,跑去执行处理函数,回来后,诶,我不等了,我运行后面的去了。
解决这个问题就搞循环,正常等到结果后就退出,被中断的情况就循环继续给爷等。
//waitpid正常返回等待的pid,并且保证ctrl+z或ctrl+c中断(更改cur_pid)正常结束等待
while(waitpid(cur_pid, NULL, 0) != cur_pid && cur_pid != 0);
do
{
std::cin.clear();
}//getline被中断会返回个啥来着,反正会继续循环
while (!std::getline(std::cin, input));