免费注册 查看新帖 |

Chinaunix

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

弱弱的问一个 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-15 14:12 |只看该作者 |倒序浏览

  1. #!/usr/bin/perl

  2. foreach (@ARGV) {
  3.         $process{$_} = 0;
  4. }
  5. open STATUS, "ps -e |";
  6. while (<STATUS>) {
  7.         ($pid, $name) = (split /\s+/)[0,3];
  8.         if (defined($process{$name})) {
  9.                 print "kill process $name, process id $pid ...\n";
  10.                 $cnt = kill 9, $pid;
  11.                 printf STDERR "$pid: $!\n" if !$cnt;
  12.         }
  13. }
  14. close STATUS;

复制代码

STATUS表示什么? defined($process{$name})有什么效果?还有 $cnt=kill 9,$pid; 是shell命令吗?

论坛徽章:
0
2 [报告]
发表于 2007-03-15 14:18 |只看该作者
去读读文件句柄相关的东西吧,STATUS只是一个文件句柄的名称
foreach部分指定$process($_) = 0以后
defined($process{$name})是一个判断,返回值为true就执行{}里面的杀进程
$cnt = kill 9, $pid;  调用的Perl的函数kill,$cnt是kill的返回值

[ 本帖最后由 Ksharp 于 2007-3-15 14:52 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-03-15 14:30 |只看该作者
原帖由 Ksharp 于 2007-3-15 14:18 发表
去读读文件句柄相关的东西吧,STATUS只是一个文件句柄的名称
defined($process{$name})是一个判断,但是这个程序的foreach部分我没看懂,为什么要把每个数组的变量都初始为0呢?defined(0)是什么意思?
$cnt =  ...

文件句柄我在书上就看到这几个:STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT
defined后的括号里一定是0么?
我也不明白为什么是kill 9而不是kill -9
这段代码的功能是杀指定名字的进程,运行后确实可以杀掉

论坛徽章:
0
4 [报告]
发表于 2007-03-15 14:35 |只看该作者
……
再仔细读读,你说的那些只是Perl自带的,有特殊含义的,Programmer可以自己定义新的句柄和句柄名啊
比如代码里的STATUS里面保存的就是ps -e的结果

论坛徽章:
0
5 [报告]
发表于 2007-03-15 14:37 |只看该作者
原帖由 Ksharp 于 2007-3-15 14:35 发表
……
再仔细读读,你说的那些只是Perl自带的,有特殊含义的,Programmer可以自己定义新的句柄和句柄名啊
比如代码里的STATUS里面保存的就是ps -e的结果

哦,谢谢你啊,刚看清楚了,看来我要做做笔记了...老是忘记...

论坛徽章:
0
6 [报告]
发表于 2007-03-15 14:39 |只看该作者
不客气 互相学习 我也刚学Perl没多久

论坛徽章:
0
7 [报告]
发表于 2007-03-15 15:03 |只看该作者
我现在理解的含义是
先用foreach从@ARGV中取得要杀死的进程名称,并把它作为hash的key,然后把value初始化为0
打开一个文件句柄并将ps -e后的内容用管道传递给它
然后用while循环从句柄中提取内容
用split分割取得进程pid和进程name
这个用进程名为key在hash中找value,如果value不为0就杀掉这个进程
不过还有点不明白,hash中的value在什么时候改变了

论坛徽章:
0
8 [报告]
发表于 2007-03-15 15:14 |只看该作者
是不是它改变了hash里的value?

  1. ($pid, $name) = (split /\s+/)[0,3];
复制代码

论坛徽章:
0
9 [报告]
发表于 2007-03-15 15:22 |只看该作者
原帖由 rxpmcb 于 2007-3-15 15:03 发表
我现在理解的含义是
先用foreach从@ARGV中取得要杀死的进程名称,并把它作为hash的key,然后把value初始化为0
打开一个文件句柄并将ps -e后的内容用管道传递给它
然后用while循环从句柄中提取内容
用split分割 ...


正解
defined只是判断变量是否为空,不为空就返回true

论坛徽章:
0
10 [报告]
发表于 2007-03-15 15:25 |只看该作者
原帖由 Ksharp 于 2007-3-15 15:22 发表


正解
defined只是判断变量是否为空,不为空就返回true

可是根据我目前的判断,好象$process{$name}永远会是空的,因为初始化为0后好象就没修改里面的value
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP