LINUX前台进程和后台进程
Unix环境下,当一个进程以后台形式启动,但尝试去读写控制台终端时,将会触发SIGTTIN(读)和SIGTTOU(写)信号量,接着,进程将会暂停(linux默认情况下),read/write将会返回错误。这个时候,shell将会发送通知给用户,提醒用户切换此进程为前台进程,以便继续执行。由后台切换至前台的方式是fg
命令,前台转为后台则为CTRL+Z
快捷键。
mac系统和linux收到SIGTTOU
信号量后的默认行为不一致,mac是默认忽略,而linux是默认启用。可以用 stty stop/-stop
命令是用于设置是否执行暂停,stty -a
可以查看当前tty的配置参数。
如何才能在不把进程切换至前台的情况下,读写控制器不会被暂停?
只要忽略SIGTTIN
和SIGTTOU
信号量即可:signal(SIGTTOU, SIG_IGN)。
操作系统中,前台进程和后台进程有什么区别?特征是什么?
后台程序基本上不和用户交互,优先级别稍微低一点 前台的程序和用户交互,需要较高的响应速度,优先级别稍微高一点
LINUX后台进程也叫守护进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般用作系统服务,可以用crontab提交,编辑或者删除相应得作业。守护的意思就是不受终端控制。Linux的大多数服务器就是用守护进程实现的。比如Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。
前台进程就是用户使用的有控制终端的进程
shell下,进程的前台与后台运行
跟系统任务相关的几个命令:fg、bg、jobs、&、ctrl+z
1.&最经常被用到
这个用在一个命令的最后,可以把这个命令放到后台执行
2.ctrl+z
可以将一个正在前台执行的命令放到后台,并且暂停
3.jobs
查看当前有多少在后台运行的命令
4.fg
将后台中的命令调至前台继续运行
如果后台中有多个命令,可以用fg%jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
5.bg将一个在后台暂停的命令,变成继续执行
如果后台中有多个命令,可以用bg%jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
1.jobs列举出后台作业信息。([作业号]运行状态作业名称)
2.ctrl+z将任务放到后台去,并暂停;
3.bg<%int>将后台任务唤醒,在后台运行;
4.fg<%int>将后任务的程序放到前台;
1.ctrl+z将任务放到后台去,并暂停.
主进程waitpid(pid,&status,WUNTRACED)时,子进程
退出时,父进程被唤醒
2.将后台任务唤醒,在后台运行;
kill(pid,SIGCONT);
3.将后台运行的程序放到前台;
kill(pid,SIGCONT);
waitpid(pid,&status,WUNTRACED);
可见,后台运行与前台运行的区别只在于前台运行等待子进程的退出而阻塞父进程操作。而后台运行时,可以在父进程中输入命令继续其他操作。本质上没有区别,都是给子进程发送SIGCONT信号。