zoukankan      html  css  js  c++  java
  • 后台进程不等于守护进程

    http://www.360doc.com/content/12/0731/15/1429472_227474394.shtml

    之前一直在模糊化这两个概念,其实两者不等于。

    为什么?最重要的区别,也是最直观的区别,守护进程没有控制终端,而后台进程还有。

    通过这样的方式启动firefox, 
    #firefox &
    firefox现在在后台运行了,但是它等于守护进程吗?不!
    因为它并没有脱离控制终端,不信?你试着吧启动firefox的终端关掉,看看firefox会不会跟着一起关闭。 

    1. 后台的文件描述符也是继承于父进程,例如shell,所以它也可以在当前终端下显示输出数据。

    但是daemon进程自己变成了进程组长,其文件描述符号和控制终端没有关联,是控制台无关的。

    2.基本上任何一个程序都可以后台运行,但守护进程是具有特殊要求的程序,比如要脱离自己的父进程,成为自己的会话组长等,这些要在代码中显式地写出来


    换句话说,守护进程肯定是后台进程,但反之不成立。守护进程顾名思义,主要用于一些长期运行,守护着自己的职责(监听端口,监听服务等)。我们的系统下就有很多守护进程。

    3.守护进程成为了进程组长(或者会话组长),和控制终端失去了联系(其文件描述符也是继承于父进程的,但是在变成守护进程的同时stdin,stdout,stderr和控制台失去联系了)

    有没有谁知道如何阻塞Linux后台守护进程(比如cupsd),并在一段时间后解除阻塞状态,谢谢!

    纯粹的定时睡眼可以用sleep,usleep ,,,, select/poll/epoll....
    除sleep外,别的精度都比较高.

    如果是还带条件唤醒的话,就用mutex+cond,,,sem, pipe+select/poll/epoll等等都可以做到.
    pthread_mutex_timedlock
    pthread_cond_timedwait...

    新增一个为空的文件,文件一直存在就守护。进程运行完毕,删除文件

    给此守护进程发送SIGSTOP信号即可!
    若要其恢复,则发送SIGCONT信号

    shell命令中用kill -SIGSTOP pid,
    kill -SIGCONT pid

    尝试着给cupsd进程发送了SIGSTOP信号(这个停止信号是在我的程序中发的),但执行结果是sh: line 0: kill: SIGSTOP: invalid signal specification

    但单独执行kill -SIGSTOP pid却是可以的!不知道为什么,难道我获取的PID有问题!

    你好,通过这种方式确实将后台的守护进程给在暂停了,但是恢复后并不能继续执行暂停前的任务啊!
    PS:我的需求是这样的,上层应用程序将打印任务下发到打印缓冲队列中,而后台打印守护进程(cupsd)从缓冲队列中获取打印数据区打印。我想在打印守护进程获取打印数据之前将其阻塞,即先让打印守护进程停下来,等我将打印缓冲队列中的文件做了分析之后,再恢复打印守护进程,让其去打印。
        通过发信号的方式确实让打印守护进程停下来了,但是等我分析完成之后,恢复打印守护进程,并不能打印我之前的任务啊!
        请问问题出在哪啊!谢谢

    和cupsd的实现有关,

    如题,我写了一个很小的程序,从控制台输入一个字符。启动程序以后,发送一个SIGSTOP给他。
    [*]#include[*]#include[*]int main(void)[*]{[*] printf("beforen");
    [*] getchar();[*] printf("aftern");[*] return 0;}
    然后在第一个终端里面:#g++ w.cpp && ./a.out在第二个终端里面
    :#pgrep a.out|xargs kill -s SIGSTOP此时,可以看到第一个终端里面变成了:# ./a.outbefore[1]+ Stopped ./a.out
    #问题: 如何能够使得a.out恢复运行,也就是可以让我在第一个终端里面继续运行a.out并接受用户输入?
    可以做到么? 如果不可以做到,那么SIGSTOP到底有什么用途?谢谢。


    回复 3# weichuang02 fg命令发送了SIGCONT信号。信号不能使一个进程成为前台进程,
    SIGCONT可以使它继续运行(在后台运行),但你的程序做不到。因为你的程序在等待终端输入,而它不是前台进程,
    所以SIGCONT后无法读取,然后会产生SIGTTIN信号,而这个信号的默认动作是使进程暂停执行,所以不会继续执行。

    
    
  • 相关阅读:
    第七组第五次Alpha冲刺会议
    第七组第四次Alpha冲刺会议
    第三次Alpha冲刺会议&&期中回顾总结
    八级大狂风-项目系统设计与数据库设计
    Python之路——hmac模块
    Python之路——多线程
    Python之路——requests模块
    Python之路——并行编程之multiprocessing模块
    Python之路——迷宫问题
    Python之路——configparser模块
  • 原文地址:https://www.cnblogs.com/virusolf/p/5420152.html
Copyright © 2011-2022 走看看