免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2693 | 回复: 3
打印 上一主题 下一主题

子进程退出父进程也跟着退出了。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-13 15:23 |只看该作者 |倒序浏览
我在父进程中vfork了一个子进程,在子进程中运行telnet。结果当我退出telnet时,父进程也跟着退出了。

我用waitpgid得到的退出状态是256.

请问这是为什么,这个问题已经困扰好几天了。

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
2 [报告]
发表于 2008-11-13 15:35 |只看该作者

回复 #1 312-pirl0 的帖子

父进程是一个无限循环吗?
能否把代码贴出来呢?

论坛徽章:
0
3 [报告]
发表于 2008-11-13 15:57 |只看该作者
父进程是个类似命令行的东西,是无限循环的。

    string final_command = _command;
    list<string>::const_iterator iter;
    for (iter = _argument_list.begin(); iter != _argument_list.end(); ++iter) {
        final_command += " ";
        final_command += *iter;
    }

    //
    // Save the current execution ID, and set the new execution ID
    //
    _exec_id.save_current_exec_id();
    if (_exec_id.set_effective_exec_id(error_msg) != XORP_OK) {
        XLOG_ERROR("Failed to set effective execution ID: %s",
                   error_msg.c_str());
        _exec_id.restore_saved_exec_id(error_msg);
        return (XORP_ERROR);
    }

#ifndef HOST_OS_WINDOWS
    signal(SIGCHLD, child_handler);
#endif

    //
    // Temporary block the child signals
    //
    block_child_signals();

    //
    // Run the command
    //
    _pid = popen2(_command, _argument_list, _stdout_stream, _stderr_stream,
                  redirect_stderr_to_stdout());
    if (_stdout_stream == NULL) {
        XLOG_ERROR("Failed to execute command \"%s\"", final_command.c_str());
        cleanup();
        _exec_id.restore_saved_exec_id(error_msg);
        return (XORP_ERROR);
    }
    // Insert the new process to the map of processes
    XLOG_ASSERT(pid2command.find(_pid) == pid2command.end());
    pid2command[_pid] = this;

    _is_running = true;

    //
    // Restore the saved execution ID
    //
    _exec_id.restore_saved_exec_id(error_msg);

    //
    // Unblock the child signals that were blocked earlier
    //
    unblock_child_signals();

    return (XORP_OK);

static void
child_handler(int signo)
{
    XLOG_ASSERT(signo == SIGCHLD);

    do {
        pid_t pid = 0;
        int wait_status = 0;
        map<pid_t, RunCommandBase *>::iterator iter;

        pid = waitpid(-1, &wait_status, WUNTRACED | WNOHANG);
        debug_msg("pid=%d, wait status=%d\n", XORP_INT_CAST(pid), wait_status);
        if (pid <= 0)
            return;        // XXX: no more child processes

        XLOG_ASSERT(pid > 0);
        popen2_mark_as_closed(pid, wait_status);
        iter = pid2command.find(pid);
        if (iter == pid2command.end()) {
            // XXX: we don't know anything about the exited process
            continue;
        }

        RunCommandBase* run_command = iter->second;
        run_command->wait_status_changed(wait_status);
    } while (true);
}

这是主要的代码。

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
4 [报告]
发表于 2008-11-13 18:08 |只看该作者
父进程异常退出,有没有core dump呢?
如果生成了core文件,可以使用gdb进行调试,这样定位问题就方便了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP