My FAQ,最新最全的IT技术FAQ
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 未整理篇 | 技术讨论
  当前位置: > 操作系统 > SCO_Unix
在Unix系统中利用程序实现Kill命令
作者:未知 时间:2005-09-13 15:17 出处:ChinaUnix.net 责编:My FAQ
              摘要:在Unix系统中利用程序实现Kill命令

在正常情况下,一般先通过 Unix 系统的 ps命令,找到相关进程的进程号(pid),然后用 kill 9 pid 终止这些进程。这些操作对计算机专业人员很简单,但对业务人员来说,却是比较复杂的操作。如果能利用一段程序,业务人员只需要输入终端号,即可杀死该终端的所有进程并重新激活,就可以简化这种操作,提高工作效率。本文简单介绍这种程序的实现方法。  
程序的功能是根据终端号杀死进程并激活终端,操作上只要在另一台终端上执行 killtty ttyname即可,其中ttyname 是需要激活的终端号。程序的实现原理是根据输入的终端号,找到该终端运行的所有进程的进程号,并把这些进程号写入文件。然后由大到小依次读出所有的进程号,并执行Unix的系统命令 kill(pid,SIGKILL),将该进程杀死。程序的源代码如下:  
#include<stdio.h>  
#include<sys/types.h>  
#include<signal.h>  
main(argc,argv)  
int argc;  
char *argv[];  
{  
FILE *fp;  
char fname[50],pscmd[50],ttyname[10];  
if(argc< 2){  
printf(“usage:%s /dev/ttyname|ttyname|name}\n”,argv[0]);  
exit(0);  
}  
strcpy(fname,“/tmp/psout”);  
strcat(fname,argv[1]);  
if(!strncmp(argv[1],“/dev/”,5)){  
strncpy(ttyname,argv[1]+5,9);  
}  
else if(!strncmp(argv[1],“tty”,3))  
strcpy(ttyname,argv[1]);  
else{  
strcpy(ttyname,“tty”);  
strcat(ttyname,argv[1]);  
}  
sprintf(pscmd,“ps -o \"pid=\“-t %s>%s”,ttyname,fname);  
if(system(pscmd)<0){  
exit(-1);  
}  
kill_pid(fname);  
}  
kill_pid(filename)  
char *filename;  
{  
FILE *fp;  
char ch,pid[10];  
int *ipid;  
ipid=(int *)(malloc(sizeof(int)));  
if((fp=fopen(filename,“r”))==NULL){  
exit(-1);  
}  
while(fgets(pid,20,fp)!=NULL){  
*ipid=atoi(pid);  
ipid++;  
}  
fclose(fp);  
while(--ipid){  
kill(*ipid,SIGKILL);  
}  
}  
上述程序中有关Unix的系统调用问题,请参考有关的技术资料,这里不再赘述。该程序在SCO OpenServer 5.04下编译通过,可直接在该系统中编译运行。 
看贴不回~~~~~~~~鄙视~~~~~~~~` :em08:  :em19:  :em19:  :em19:  :em19:

 绣林 回复于:2004-05-12 14:56:43
这个有用

 l__sl 回复于:2004-05-12 15:05:11
呵呵    谢谢支持

 午夜聆听 回复于:2004-05-12 15:10:32
好东西,我要试试!

 l__sl 回复于:2004-05-12 15:13:35
晕着呢
你是第一个说这个是好东西的,
谢谢

 postyw 回复于:2004-05-12 15:16:07
是不错,但用什么用户去运行呢,一般用户权限可以吗?

 sdccf 回复于:2004-05-12 15:16:48
我都加为精华帖子了,当然是好东西。

 l__sl 回复于:2004-05-12 15:21:56
呵呵
斑竹果然有眼力哦

 风之风 回复于:2004-05-12 16:38:16
对业务员有用!

 萝卡 回复于:2004-05-12 19:00:14
顶顶顶

 gordon7100 回复于:2004-05-12 19:05:04
请问那有gcc可以下载吗?

 sdccf 回复于:2004-05-12 20:44:27
ftp://ftp2.caldera.com

 天海 回复于:2004-05-14 13:42:43
我发现你是一个很历害的人
请问能给我发一些小的实例程序吗,关于fork()和管道的吗
多Thank You!;
我可是你的老步下了:
我的 www.stiandao@sina.com

 silverwolf 回复于:2004-05-14 15:58:02
[quote:14b22907e0="l__sl"]
  kill_pid(filename) 
  char *filename
  { 
    FILE *fp; 
    char ch, pid[10]; 

    int *ipid; 
    ipid=(int *)(malloc(sizeof(int))); 
    if((fp=fopen(filename,"r")) == NULL)
    { 
     exit(-1); 
    } 

    while(fgets(pid,20,fp) != NULL)
    { 
     *ipid = atoi(pid); 
     ipid++; 
    } 

    fclose(fp); 
    while(--ipid)
    { 
      kill(*ipid,SIGKILL); 
    } 
  } 
[/quote:14b22907e0]
感觉这样写很危险, ipid++后的内容可能不可预见
还有上面fname,  pscmd,ttyname也没有清空

 l__sl 回复于:2004-05-14 16:15:18
呵呵试试不就知道了,

 htldm 回复于:2004-05-14 18:50:07
silverwolf 分析得有道理

 silverwolf 回复于:2004-05-14 20:01:39
[quote:871141a13b="l__sl"]呵呵试试不就知道了,[/quote:871141a13b]
试得可能性是有可能成功,有可能失败。
但是要看你编译器和当时堆的情况而定。

 james70 回复于:2004-05-14 22:24:11
好文章,已拜读

 kind_satan 回复于:2004-05-14 23:23:09
我喜欢

 sniper 回复于:2004-05-16 10:06:19
能用Shell实现吗?

 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 myfaq.com.cn All rights reserved. www.myfaq.com.cn 版权所有