作者sunneo (艾斯寇德)
看板LinuxDev
标题[转录][问题]定期砍掉run的死程序
时间Wed Sep 26 21:09:08 2007
※ [本文转录自 C_and_CPP 看板]
作者: cerebellum (ymca) 看板: C_and_CPP
标题: [问题]定期砍掉run的死程序
时间: Wed Sep 26 21:03:52 2007
由於qkmj这个程式若是不正常断线 会造成一个死程序 且cpu资源大量被其占用
参考了彰师大生物系BioStar的程式
发现在ubuntu上实际执行起来只会砍掉一个执行序
而不会把全部正在run的qkmj程式砍除 而且有时候执行根本无效 要执行多次才会成功
以下是程式码 有经过稍微的修改(因为原本的根本不会跑)
是否可以请各位帮忙看一下是那里的问题 感谢
checkqkmj.c
#include <stdio.h>
int
main()
{
int line;
FILE *fp;
char a[20], b[20], c[20], d[20], e[20], f[20];
char g[20], h[20], i[20], j[20], k[20];
char cmd[128], *str;
char tmpfile[32];
int process_a[16], process_b[16], ii, jj;
strcpy(tmpfile, "/tmp/killtop1");
/* 只取出非 idle 中的 qkmj */
sprintf(cmd, "top -i -b -n 1 | grep qkmj > %s", tmpfile);
/* 制作第一份执行中 qkmj 程序名单 */
system(cmd);
if (!(fp = fopen(tmpfile, "r")))
return -1;
for (line = 0; line <= 14; line++)
if (fscanf(fp, "%s %s %s %s %s %s %s %s %s %s %s",
a, b, c, d, e, f, g, h, i, j, k) == 11)
process_a[line] = atoi(a);
else
process_a[line] = 0;
fclose(fp);
unlink(tmpfile);
sleep(5); /* 小睡五秒 */
/* 制作第二份执行中 qkmj 程序名单 */
system(cmd);
if (!(fp = fopen(tmpfile, "r")))
return -1;
for (line = 0; line <= 14; line++)
if (fscanf(fp, "%s %s %s %s %s %s %s %s %s %s %s",
a, b, c, d, e, f, g, h, i, j, k) == 11)
process_b[line] = atoi(a);
else
process_b[line] = 0;
fclose(fp);
unlink(tmpfile);
/* 比对两份 qkmj 程序名单 */
for (ii = 0; ii <= 14; ii++)
{
if (!process_a[ii])
break;
for (jj = 0; jj <= 14; jj++)
{
if (!process_b[jj])
break;
if (process_a[ii] == process_b[jj]) /* 如果发现有相同 */
{
sprintf(cmd, "kill -9 %d", process_a[ii]);
system(cmd); /* 代表这极有可能是死程序,必须 kill 掉 */
}
}
}
return 0;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.116.64.220
1F:→ sunneo:... 09/26 21:05
--
IceCold::IceCode
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.228.138
2F:推 yhuiyang:两个for loop中的break是continue的笔误? 09/27 00:53