user-0 提问: linux父子进程生死

回复:
user: user-1
content: 引用 22 楼 jack960330 的回复:[quote=引用 21 楼 adlay 的回复:] [quote=引用 20 楼 jack960330 的回复:] [quote=引用 6 楼 adlay 的回复:] 你起的进程不是因为父进程死了而死的，而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。  你说的也不对，是因为父进程结束，操作系统会发送一个事件给所有的子进程，而这个事件的默认处理是：进程终止[/quote] [/quote] 当子进程停止，同时父进程挂断，内核就会发送SIGHUP信号给子进程[/quote]  引用 23 楼 jack960330 的回复:父进程退出时，进程组成为了孤儿进程组，这时内核就会发出SIGHUP信号  这个对被停止的进程, 是针对那些被按了 Ctrl+Z 的, 或者被 gdb 之类的调试器调试着的进程吧,  现在这个 wireshark 并不处于这个停止的状态, 所以并不是  "因为父进程结束，操作系统会发送一个事件给所有的子进程，而这个事件的默认处理是：进程终止"  吧

user: user-1
content: 引用 20 楼 jack960330 的回复:[quote=引用 6 楼 adlay 的回复:] 你起的进程不是因为父进程死了而死的，而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。  你说的也不对，是因为父进程结束，操作系统会发送一个事件给所有的子进程，而这个事件的默认处理是：进程终止[/quote] 请问发送的是什么信号？操作系统描述这一机制的文档在哪里？别凭自己的想象来判断。  UNIX 只有子进程结束了向父进程发送 SIGCHLD 信号; 终端结束了向属于这个 Session 的进程发送 SIGHUP， SIGHUP 默认行为是终止进程; 没听说过有父进程结束向子进程发信号的， 如果你看到了，请指明发送的是什么信号!

user: user-2
content: 引用 6 楼 adlay 的回复:你起的进程不是因为父进程死了而死的，而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。  你说的也不对，是因为父进程结束，操作系统会发送一个事件给所有的子进程，而这个事件的默认处理是：进程终止

user: user-2
content: 引用 21 楼 adlay 的回复:[quote=引用 20 楼 jack960330 的回复:] [quote=引用 6 楼 adlay 的回复:] 你起的进程不是因为父进程死了而死的，而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。  你说的也不对，是因为父进程结束，操作系统会发送一个事件给所有的子进程，而这个事件的默认处理是：进程终止[/quote] 请问发送的是什么信号？操作系统描述这一机制的文档在哪里？别凭自己的想象来判断。  UNIX 只有子进程结束了向父进程发送 SIGCHLD 信号; 终端结束了向属于这个 Session 的进程发送 SIGHUP， SIGHUP 默认行为是终止进程; 没听说过有父进程结束向子进程发信号的， 如果你看到了，请指明发送的是什么信号! [/quote] 父进程退出时，进程组成为了孤儿进程组，这时内核就会发出SIGHUP信号

user: user-2
content: 引用 21 楼 adlay 的回复:[quote=引用 20 楼 jack960330 的回复:] [quote=引用 6 楼 adlay 的回复:] 你起的进程不是因为父进程死了而死的，而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。  你说的也不对，是因为父进程结束，操作系统会发送一个事件给所有的子进程，而这个事件的默认处理是：进程终止[/quote] 请问发送的是什么信号？操作系统描述这一机制的文档在哪里？别凭自己的想象来判断。  UNIX 只有子进程结束了向父进程发送 SIGCHLD 信号; 终端结束了向属于这个 Session 的进程发送 SIGHUP， SIGHUP 默认行为是终止进程; 没听说过有父进程结束向子进程发信号的， 如果你看到了，请指明发送的是什么信号! [/quote] 当子进程停止，同时父进程挂断，内核就会发送SIGHUP信号给子进程

user: user-3
content: 顶bsnry，所以说LZ不要用自己头脑中的经验去假想别人会怎么做。

user: user-4
content: 引用 17 楼 bsnry 的回复:[quote=引用 7 楼 ForestDB 的回复:] 第三个问题看mib2c的帮助文档。  void netsnmp_init_mib(void) {     const char     *prefix;     char           *env_var, *entry;     PrefixListPtr   pp = &mib_prefixes[0];     char           *st = NULL;      if (Mib)         return;     netsnmp_init_mib_internals();      /*      * Initialise the MIB directory/ies       */     netsnmp_fixup_mib_directory();     env_var = strdup(netsnmp_get_mib_directory());     netsnmp_mibindex_load();      DEBUGMSGTL(("init_mib",                 "Seen MIBDIRS: Looking in '%s' for mib dirs ...\n",                 env_var));      entry = strtok_r(env_var, ENV_SEPARATOR, &st);     while (entry) {         add_mibdir(entry);         entry = strtok_r(NULL, ENV_SEPARATOR, &st);     }     SNMP_FREE(env_var);      env_var = netsnmp_getenv("MIBFILES");     if (env_var != NULL) {         if (*env_var == '+')             entry = strtok_r(env_var+1, ENV_SEPARATOR, &st);         else             entry = strtok_r(env_var, ENV_SEPARATOR, &st);         while (entry) {             add_mibfile(entry, NULL, NULL);             entry = strtok_r(NULL, ENV_SEPARATOR, &st);         }     }      netsnmp_init_mib_internals();      /*      * Read in any modules or mibs requested       */      env_var = netsnmp_getenv("MIBS");     if (env_var == NULL) {         if (confmibs != NULL)             env_var = strdup(confmibs);         else             env_var = strdup(NETSNMP_DEFAULT_MIBS);     } else {         env_var = strdup(env_var);     }     if (env_var && ((*env_var == '+') || (*env_var == '-'))) {         entry =             (char *) malloc(strlen(NETSNMP_DEFAULT_MIBS) + strlen(env_var) + 2);         if (!entry) {             DEBUGMSGTL(("init_mib", "env mibs malloc failed"));             SNMP_FREE(env_var);             return;         } else {             if (*env_var == '+')                 sprintf(entry, "%s%c%s", NETSNMP_DEFAULT_MIBS, ENV_SEPARATOR_CHAR,                         env_var+1);             else                 sprintf(entry, "%s%c%s", env_var+1, ENV_SEPARATOR_CHAR,                         NETSNMP_DEFAULT_MIBS );         }         SNMP_FREE(env_var);         env_var = entry;     }  env_var = netsnmp_getenv("MIBS");     if (env_var && ((*env_var == '+') || (*env_var == '-'))) {  看+号，  这说明+号是代码自身处理。与linux无关。   猜测windows也是如此。这个程序是跨平台的，没有在网上看到windos的使用例子。  但代码是这样处理的。 [/quote]   代码看了一下， windows应该差不多。  只不过env mibs='+'  mib2c  windows肯定是不能这么用的。

user: user-4
content: 引用 7 楼 ForestDB 的回复:第三个问题看mib2c的帮助文档。  void netsnmp_init_mib(void) {     const char     *prefix;     char           *env_var, *entry;     PrefixListPtr   pp = &mib_prefixes[0];     char           *st = NULL;      if (Mib)         return;     netsnmp_init_mib_internals();      /*      * Initialise the MIB directory/ies       */     netsnmp_fixup_mib_directory();     env_var = strdup(netsnmp_get_mib_directory());     netsnmp_mibindex_load();      DEBUGMSGTL(("init_mib",                 "Seen MIBDIRS: Looking in '%s' for mib dirs ...\n",                 env_var));      entry = strtok_r(env_var, ENV_SEPARATOR, &st);     while (entry) {         add_mibdir(entry);         entry = strtok_r(NULL, ENV_SEPARATOR, &st);     }     SNMP_FREE(env_var);      env_var = netsnmp_getenv("MIBFILES");     if (env_var != NULL) {         if (*env_var == '+')             entry = strtok_r(env_var+1, ENV_SEPARATOR, &st);         else             entry = strtok_r(env_var, ENV_SEPARATOR, &st);         while (entry) {             add_mibfile(entry, NULL, NULL);             entry = strtok_r(NULL, ENV_SEPARATOR, &st);         }     }      netsnmp_init_mib_internals();      /*      * Read in any modules or mibs requested       */      env_var = netsnmp_getenv("MIBS");     if (env_var == NULL) {         if (confmibs != NULL)             env_var = strdup(confmibs);         else             env_var = strdup(NETSNMP_DEFAULT_MIBS);     } else {         env_var = strdup(env_var);     }     if (env_var && ((*env_var == '+') || (*env_var == '-'))) {         entry =             (char *) malloc(strlen(NETSNMP_DEFAULT_MIBS) + strlen(env_var) + 2);         if (!entry) {             DEBUGMSGTL(("init_mib", "env mibs malloc failed"));             SNMP_FREE(env_var);             return;         } else {             if (*env_var == '+')                 sprintf(entry, "%s%c%s", NETSNMP_DEFAULT_MIBS, ENV_SEPARATOR_CHAR,                         env_var+1);             else                 sprintf(entry, "%s%c%s", env_var+1, ENV_SEPARATOR_CHAR,                         NETSNMP_DEFAULT_MIBS );         }         SNMP_FREE(env_var);         env_var = entry;     }  env_var = netsnmp_getenv("MIBS");     if (env_var && ((*env_var == '+') || (*env_var == '-'))) {  看+号，  这说明+号是代码自身处理。与linux无关。   猜测windows也是如此。这个程序是跨平台的，没有在网上看到windos的使用例子。  但代码是这样处理的。

user: user-0
content: 引用 6 楼 adlay 的回复:你起的进程不是因为父进程死了而死的，而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。  在桌面双击一个程序呢？  这有会话？  桌面里可以不需要运行终端啊

user: user-4
content: mib2c是一个perl脚本，估计要看源码，才能搞清楚， +号的意思，  个人觉得与 env无关。

user: user-4
content: 引用 7 楼 ForestDB 的回复:第三个问题看mib2c的帮助文档。    The mib2c tool accepts both SMIv1 and SMIv2 MIBs.         mib2c needs to be able to find and load a MIB file in order to generate C code for the MIB. To enable mib2c to find the MIB        file,  set  the  MIBS  environment  variable to include the MIB file you are using.  An example of setting this environment        variable is:            MIBS=+NET-SNMP-TUTORIAL-MIB            or            MIBS=ALL

user: user-2
content: 引用 13 楼 jack960330 的回复:楼主 ，是这样一回事，你既然说道父子进程，想必你也知道进程树吧，正常情况下，shell里启动的进程属于shell的子进程(子树)归shell管，如果shell进程结束，一般情况下，它里面启动的所有进程也会结束，但是我记得有一个快捷键，能让进程进入后台守护进程状态，也就是说，脱离shell的控制，变成孤立进程，这个时候，进程会自动被linux 0号进程接管，除此之外还有几种方法。 方法有以下几种： 1、在命令后加一个&，将其放入作业队列,，方法是:  $     ./wireshark &   2、就是我说的，启动进程后，首先按ctrl+z暂停已经运行的进程，然后使用bg命令将停止的作业放到后台运行    但是这些方法也有个问题，那就是父进程目前还是没有任何变动，后台执行的进程，其父进程还是当前终端shell的进程，而一旦父进程退出，则会发送hangup信号给所有子进程，子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程，则需要使用nohup忽略hangup信号。使用如下代码  $    ./wireshark $    <ctrl+z> $    nohup ./wireshark &    以上回答如有错误，请楼下指出。  $    ./wireshark $    <ctrl+z> $     pg <ctrl+z>时显示的暂停的进程的作业ID $    nohup ./wireshark &  抱歉，我打错了，第二个方法代码还得把暂停的进程转后台执行

user: user-2
content: 楼主 ，是这样一回事，你既然说道父子进程，想必你也知道进程树吧，正常情况下，shell里启动的进程属于shell的子进程(子树)归shell管，如果shell进程结束，一般情况下，它里面启动的所有进程也会结束，但是我记得有一个快捷键，能让进程进入后台守护进程状态，也就是说，脱离shell的控制，变成孤立进程，这个时候，进程会自动被linux 0号进程接管，除此之外还有几种方法。 方法有以下几种： 1、在命令后加一个&，将其放入作业队列,，方法是:  $     ./wireshark &   2、就是我说的，启动进程后，首先按ctrl+z暂停已经运行的进程，然后使用bg命令将停止的作业放到后台运行    但是这些方法也有个问题，那就是父进程目前还是没有任何变动，后台执行的进程，其父进程还是当前终端shell的进程，而一旦父进程退出，则会发送hangup信号给所有子进程，子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程，则需要使用nohup忽略hangup信号。使用如下代码  $    ./wireshark $    <ctrl+z> $    nohup ./wireshark &    以上回答如有错误，请楼下指出。

user: user-5
content: 第一个问题  是运行环境退出了 ，说以wireshark就退出了   单独点击快捷方式是可以独立运行的

user: user-6
content: 你的wireshark没有后台运行吧~

user: user-1
content: 引用 9 楼 adlay 的回复:[quote=引用 8 楼 caddor9100 的回复:] [quote=引用 6 楼 adlay 的回复:] 你起的进程不是因为父进程死了而死的，而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。  在桌面双击一个程序呢？  这有会话？  桌面里可以不需要运行终端啊 [/quote]  当然，桌面也是一个会话。 http://baike.baidu.com/view/2879217.htm[/quote] 从桌面启动的程序，如果这个桌面会话终止了，那些程序也会终止（如果他们没有脱离的话）

user: user-1
content: 引用 8 楼 caddor9100 的回复:[quote=引用 6 楼 adlay 的回复:] 你起的进程不是因为父进程死了而死的，而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。  在桌面双击一个程序呢？  这有会话？  桌面里可以不需要运行终端啊 [/quote]  当然，桌面也是一个会话。 http://baike.baidu.com/view/2879217.htm

user: user-3
content: nohup ./wireshark &

user: user-7
content: 父进程死 子进程也得死，当然有这么干的  第二个问题，在

user: user-3
content: 第三个问题看mib2c的帮助文档。