免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zhongfangqing
打印 上一主题 下一主题

请教杀进程 [复制链接]

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
21 [报告]
发表于 2007-07-25 18:36 |只看该作者
原帖由 net_robber 于 2007-7-25 18:31 发表

不可中断的睡眠状态能不能举个例子??

进程调用一些I/O函数,函数进入在内核驱动中可能会主动不可中断睡眠

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
22 [报告]
发表于 2007-07-25 18:51 |只看该作者
原帖由 net_robber 于 2007-7-25 18:31 发表

不可中断的睡眠状态能不能举个例子??

这个只能在内核中设置,用户态不允许这样做。

论坛徽章:
0
23 [报告]
发表于 2007-07-25 21:07 |只看该作者
进程在D 状态(ps -ef 显示), 也就是TASK_UNINTERRUPTALBE状态kill -9 没有办法,因为无法接受信号.

等待网络I/O,等待磁盘I/O等操作进程在内河中都有短暂的D状态, 但很快就离开次状态.
如果驱动程序写的不好, 或等待永远无法完成的I/O就会造成停留在D状态,无法kill.

比如,读一个断了线的NFS(驱动的原因?), 比如正在读CD, 结果CD盘坏了,读USB盘时拔出了USB,
等...

我自己有一个联通的无线CDMA SIM卡上网(WINDOWS XP下), 只要我手摸一下天线,进程立刻死在那里,task manage也无法杀,除非启动机器,有时甚至机器彻底死了. ---驱动有问题,不许手摸.

论坛徽章:
0
24 [报告]
发表于 2007-07-26 09:06 |只看该作者
谢谢各位热心朋友,杀不死,是system()这个函数进去了,压根儿就没返回,该杀的进程没有杀掉,杀手线程反而阻在这个调用了.

论坛徽章:
0
25 [报告]
发表于 2007-07-26 10:15 |只看该作者
ps -ef 命令经过过滤后的显示结果,此时已经运行了system().

[root@zfq152 testTeacher]# ps -ef | grep vnc | grep -v grep

root      6423  6418  0 09:48 pts/2    00:00:00 /usr/share/testTeacher/VNC_C/vncviewer/vncviewer -viewonly 199.99.99.151::21187


/************************************************************************************/

这是启动代码:
        pCmd = g_strdup_printf("%s -viewonly %s::%d", DEF_VNCVIEWER_PATH, pIP, iPort);

        Printf("CK,in RemoteWatchOnThread(),pCmd=%s\n", pCmd);

        iRet = system(pCmd);

        if((-1 == iRet) || (127 == iRet))

        {

                ErrMsg("system()");

                exit(-1);

        }
        fflush(NULL);

        g_free(pCmd);



/************************************************************************************/

这是一号杀手代码:

        char *pCmd = NULL;

        int iRet = 0;

        pCmd = g_strdup_printf("ps -ef | grep vncviewer | grep -v grep | awk '{print $2}' | xargs -i kill -9 {} > /dev/null 2>&1");

        iRet = system(pCmd);

        if((-1 == iRet) || (127 == iRet))

        {

                ErrMsg("system()");

                exit(-1);

        }

        fflush(NULL);

        g_free(pCmd);


/************************************************************************************/

这是二号杀手代码

        char * pCmd = NULL;

        int iRet = 0;

        //工作到这里,为什么会关不掉阿,他奶奶的

//        pCmd = g_strdup("ps -ef | grep vncviewer | grep -v grep | awk '{print $2}' | xargs -i kill -9 {} > /dev/null 2>&1");

        pCmd = g_strdup("ps -ef | grep vncviewer | grep -v grep | awk '{print $2}' | xargs -i kill -9 {}  &");

        if(g_pstRC != NULL)

        {

                g_pstRC->bOver = TRUE;

                pthread_mutex_lock(&(g_pstRC->mutexOfRunVncviewer));

                pthread_cond_signal(&(g_pstRC->condOfRunVncviewer));

                pthread_mutex_unlock(&(g_pstRC->mutexOfRunVncviewer));

        }

        FILE *pFile = popen(pCmd, "w");

        pclose(pFile);

/*

        iRet = system(pCmd);

        if((-1 == iRet) || (127 == iRet))

        {

                ErrMsg("system()");

                exit(-1);

        }

*/

        Printf("CK,in RemoteControlOff(),after system(),iRet=%d\n", iRet);

        g_free(pCmd);

/************************************************************************************/

这是三号杀手代码

        KillPro("vncviewer");

函数的定义:

BOOL KillPro(const char *pProName)

{

        assert(pProName);

        char *pCmd = g_strdup_printf("ps -ef | grep %s | grep -v grep | awk '{print $2}'", pProName);

        int iBufLen = 512;

        char *pBuf = g_malloc0(iBufLen);

        FILE *pFile = NULL;

        pid_t pid = 0;

        int iRet = 0;

        pFile = popen(pCmd, "r");

        if(pFile)

        {

                return FALSE;

        }

        fgets(pBuf, iBufLen, pFile);

        pclose(pFile);

        pFile = NULL;

        pid = atoi(pBuf);

        if(kill(pid, SIGKILL))

        {//没杀死,继续追杀

                ErrMsg("kill(pid, SIGKILL)");

                if(kill(pid, SIGSEGV))

                {//还没杀死,再杀

                        ErrMsg("kill(pid, SIGSEGV)");

                        if(kill(pid, SIGABRT))

                        {//竟然还没杀死,再来最后一击

                                ErrMsg("kill(pid, SIGABRT)");

                                if(kill(pid, SIGTERM))

                                {

                                        return FALSE;

                                }

                        }

                }

        }

        return TRUE;

}

论坛徽章:
0
26 [报告]
发表于 2007-07-26 10:59 |只看该作者
问题解决了,但是原因还不知道为什么,哪位朋友能解释,分就给他
char *pCmd = g_strdup_printf("ps -ef | grep vncviewer | grep -v grep | awk '{print $2}' | xargs -i kill -9 {} > /dev/null 2>&1")
改成下面的摸样,注意echo后面的小点是键盘上ESC下面的那个键,不是单引号
char *pCmd = g_strdup_printf("echo `ps -ef |grep vncviewer | grep -v grep | awk '{print $2}' | xargs -i kill -9 {} > /dev/null 2>&1`");
然后再调用system(pCmd);这样,就能杀掉了.
但是,这种情况下,如果换成popen,既下面情况,仍然有时杀不掉:
FILE *pFile = popen(pCmd, "w");
pclose(pFile);
pFile = NULL;

论坛徽章:
0
27 [报告]
发表于 2007-07-27 11:47 |只看该作者
把错误码取出来,然后把strerror(errno)的内容输出看看是什么原因

论坛徽章:
0
28 [报告]
发表于 2007-07-27 11:56 |只看该作者
权限问题、不可中断、kill成功没有、系统deliver信号延时一小段

这是我看了各位以后的总结,不知道有没有补充的

论坛徽章:
0
29 [报告]
发表于 2007-07-27 12:03 |只看该作者
不可中断和传递延迟通常不是问题,都很快。
还有可能是根本没有杀成功(杀错了自己还不知道),kill pid最准确。

论坛徽章:
0
30 [报告]
发表于 2007-07-27 12:26 |只看该作者
原帖由 思一克 于 2007-7-25 21:07 发表
我自己有一个联通的无线CDMA SIM卡上网(WINDOWS XP下), 只要我手摸一下天线,进程立刻死在那里,task manage也无法杀,除非启动机器,有时甚至机器彻底死了. ---驱动有问题,不许手摸.



那不成宝马了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP