在正常情况下,一般先通过 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实现吗? |
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/