linux父子进程生死

caddor9100 2015-07-20 09:08:26
linux的进程的问题:

装了wireshark,桌面里运行终端,由于自己没有找到快捷方式,直接用命令./wireshark启动。

启动后,我觉得终端碍手碍脚,于是关闭终端,wireshark居然退出了?

难道父进程死,子进程也得死?

有这么干的吗?


另一个问题

xshell连接linux ,运行了某个程序,突然网断了, xshell的窗口退出,

大家猜猜,在xshell用命令启动的程序的进程还在不?



这2个问题,是同一个问题, 父进程和子进程的生死问题。



问题3:


env MIBS="+MY-PERSONAL-MIB" mib2c

mibc2c 是一个程序的名字



通过man env 可以得到:

env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]


env MIBS="+MY-PERSONAL-MIB" mib2c

意思是让, mib2c运行在 修改的环境里?


可是为什么多了一个+ 号?


难道,不该是 mibs=$mibs:"xxxx-mib" mib2c ?





...全文
313 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_adintr_com 2015-08-23
  • 打赏
  • 举报
回复
引用 22 楼 jack960330 的回复:
[quote=引用 21 楼 adlay 的回复:] [quote=引用 20 楼 jack960330 的回复:] [quote=引用 6 楼 adlay 的回复:] 你起的进程不是因为父进程死了而死的,而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。
你说的也不对,是因为父进程结束,操作系统会发送一个事件给所有的子进程,而这个事件的默认处理是:进程终止[/quote] [/quote] 当子进程停止,同时父进程挂断,内核就会发送SIGHUP信号给子进程[/quote]
引用 23 楼 jack960330 的回复:
父进程退出时,进程组成为了孤儿进程组,这时内核就会发出SIGHUP信号
这个对被停止的进程, 是针对那些被按了 Ctrl+Z 的, 或者被 gdb 之类的调试器调试着的进程吧, 现在这个 wireshark 并不处于这个停止的状态, 所以并不是 "因为父进程结束,操作系统会发送一个事件给所有的子进程,而这个事件的默认处理是:进程终止"
www_adintr_com 2015-08-21
  • 打赏
  • 举报
回复
引用 20 楼 jack960330 的回复:
[quote=引用 6 楼 adlay 的回复:] 你起的进程不是因为父进程死了而死的,而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。
你说的也不对,是因为父进程结束,操作系统会发送一个事件给所有的子进程,而这个事件的默认处理是:进程终止[/quote] 请问发送的是什么信号?操作系统描述这一机制的文档在哪里?别凭自己的想象来判断。 UNIX 只有子进程结束了向父进程发送 SIGCHLD 信号; 终端结束了向属于这个 Session 的进程发送 SIGHUP, SIGHUP 默认行为是终止进程; 没听说过有父进程结束向子进程发信号的, 如果你看到了,请指明发送的是什么信号!
欧阳春晖 2015-08-21
  • 打赏
  • 举报
回复
引用 6 楼 adlay 的回复:
你起的进程不是因为父进程死了而死的,而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。
你说的也不对,是因为父进程结束,操作系统会发送一个事件给所有的子进程,而这个事件的默认处理是:进程终止
欧阳春晖 2015-08-21
  • 打赏
  • 举报
回复
引用 21 楼 adlay 的回复:
[quote=引用 20 楼 jack960330 的回复:] [quote=引用 6 楼 adlay 的回复:] 你起的进程不是因为父进程死了而死的,而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。
你说的也不对,是因为父进程结束,操作系统会发送一个事件给所有的子进程,而这个事件的默认处理是:进程终止[/quote] 请问发送的是什么信号?操作系统描述这一机制的文档在哪里?别凭自己的想象来判断。 UNIX 只有子进程结束了向父进程发送 SIGCHLD 信号; 终端结束了向属于这个 Session 的进程发送 SIGHUP, SIGHUP 默认行为是终止进程; 没听说过有父进程结束向子进程发信号的, 如果你看到了,请指明发送的是什么信号! [/quote] 父进程退出时,进程组成为了孤儿进程组,这时内核就会发出SIGHUP信号
欧阳春晖 2015-08-21
  • 打赏
  • 举报
回复
引用 21 楼 adlay 的回复:
[quote=引用 20 楼 jack960330 的回复:] [quote=引用 6 楼 adlay 的回复:] 你起的进程不是因为父进程死了而死的,而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。
你说的也不对,是因为父进程结束,操作系统会发送一个事件给所有的子进程,而这个事件的默认处理是:进程终止[/quote] 请问发送的是什么信号?操作系统描述这一机制的文档在哪里?别凭自己的想象来判断。 UNIX 只有子进程结束了向父进程发送 SIGCHLD 信号; 终端结束了向属于这个 Session 的进程发送 SIGHUP, SIGHUP 默认行为是终止进程; 没听说过有父进程结束向子进程发信号的, 如果你看到了,请指明发送的是什么信号! [/quote] 当子进程停止,同时父进程挂断,内核就会发送SIGHUP信号给子进程
ForestDB 2015-07-22
  • 打赏
  • 举报
回复
顶bsnry,所以说LZ不要用自己头脑中的经验去假想别人会怎么做。
bsnry 2015-07-22
  • 打赏
  • 举报
回复
引用 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肯定是不能这么用的。
bsnry 2015-07-22
  • 打赏
  • 举报
回复
引用 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的使用例子。 但代码是这样处理的。
caddor9100 2015-07-21
  • 打赏
  • 举报
回复
引用 6 楼 adlay 的回复:
你起的进程不是因为父进程死了而死的,而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。
在桌面双击一个程序呢? 这有会话? 桌面里可以不需要运行终端啊
bsnry 2015-07-21
  • 打赏
  • 举报
回复
mib2c是一个perl脚本,估计要看源码,才能搞清楚, +号的意思, 个人觉得与 env无关。
bsnry 2015-07-21
  • 打赏
  • 举报
回复
引用 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
欧阳春晖 2015-07-21
  • 打赏
  • 举报
回复
引用 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 &
抱歉,我打错了,第二个方法代码还得把暂停的进程转后台执行
欧阳春晖 2015-07-21
  • 打赏
  • 举报
回复
楼主 ,是这样一回事,你既然说道父子进程,想必你也知道进程树吧,正常情况下,shell里启动的进程属于shell的子进程(子树)归shell管,如果shell进程结束,一般情况下,它里面启动的所有进程也会结束,但是我记得有一个快捷键,能让进程进入后台守护进程状态,也就是说,脱离shell的控制,变成孤立进程,这个时候,进程会自动被linux 0号进程接管,除此之外还有几种方法。 方法有以下几种: 1、在命令后加一个&,将其放入作业队列,,方法是:

$     ./wireshark &

2、就是我说的,启动进程后,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行 但是这些方法也有个问题,那就是父进程目前还是没有任何变动,后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号。使用如下代码

$    ./wireshark
$    <ctrl+z>
$    nohup ./wireshark &
以上回答如有错误,请楼下指出。
smartjeckk 2015-07-21
  • 打赏
  • 举报
回复
第一个问题 是运行环境退出了 ,说以wireshark就退出了 单独点击快捷方式是可以独立运行的
自信男孩 2015-07-21
  • 打赏
  • 举报
回复
你的wireshark没有后台运行吧~
www_adintr_com 2015-07-21
  • 打赏
  • 举报
回复
引用 9 楼 adlay 的回复:
[quote=引用 8 楼 caddor9100 的回复:] [quote=引用 6 楼 adlay 的回复:] 你起的进程不是因为父进程死了而死的,而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。
在桌面双击一个程序呢? 这有会话? 桌面里可以不需要运行终端啊 [/quote] 当然,桌面也是一个会话。 http://baike.baidu.com/view/2879217.htm[/quote] 从桌面启动的程序,如果这个桌面会话终止了,那些程序也会终止(如果他们没有脱离的话)
www_adintr_com 2015-07-21
  • 打赏
  • 举报
回复
引用 8 楼 caddor9100 的回复:
[quote=引用 6 楼 adlay 的回复:] 你起的进程不是因为父进程死了而死的,而是因为它所依赖的会话终端没有了而死的。所以 UNIX 下的 Daemon 进程都有一个脱离终端的步骤才能让一直存在。
在桌面双击一个程序呢? 这有会话? 桌面里可以不需要运行终端啊 [/quote] 当然,桌面也是一个会话。 http://baike.baidu.com/view/2879217.htm
ForestDB 2015-07-20
  • 打赏
  • 举报
回复
nohup ./wireshark &
derekrose 2015-07-20
  • 打赏
  • 举报
回复
父进程死 子进程也得死,当然有这么干的 第二个问题,在
ForestDB 2015-07-20
  • 打赏
  • 举报
回复
第三个问题看mib2c的帮助文档。
加载更多回复(4)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧