免费注册 查看新帖 |

Chinaunix

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

如何检测进程是否存在? [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
11 [报告]
发表于 2003-12-03 08:11 |只看该作者

如何检测进程是否存在?

  1. Andrew Gierth <andrew@erlenstar.demon.co.uk>; \r\n\r\n一种办法是读取/proc接口提供的信息 \r\n\r\n-------------------------------------------------------------------------- \r\n/* gcc -Wall -O3 -o getpid getpid.c */ \r\n#include <stdio.h>; \r\n#include <stdlib.h>; \r\n#include <sys/types.h>; \r\n#include <sys/stat.h>; \r\n#include <sys/procfs.h>; \r\n#include <unistd.h>; \r\n#include <stropts.h>; \r\n#include <dirent.h>; \r\n#include <fcntl.h>; \r\n\r\nstatic pid_t getpidbyname ( char * name, pid_t skipit ) \r\n{ \r\n    DIR *           dirHandle;  /* 目录句柄   */ \r\n    struct dirent * dirEntry;   /* 单个目录项 */ \r\n    prpsinfo_t      prp; \r\n    int             fd; \r\n    pid_t           pid = -1; \r\n\r\n    if ( ( dirHandle = opendir( \"/proc\" ) ) == NULL ) \r\n    { \r\n        return( -1 ); \r\n    } \r\n    chdir( \"/proc\" );  /* 下面使用相对路径打开文件,所以必须进入/proc */ \r\n    while ( ( dirEntry = readdir( dirHandle ) ) != NULL ) \r\n    { \r\n        if ( dirEntry->;d_name[0] != \'.\' ) \r\n        { \r\n            /* fprintf( stderr, \"%s\\n\", dirEntry->;d_name ); */ \r\n            if ( ( fd = open( dirEntry->;d_name, O_RDONLY ) ) != -1 ) \r\n            { \r\n                if ( ioctl( fd, PIOCPSINFO, &prp ) != -1 ) \r\n                { \r\n                    /* fprintf( stderr, \"%s\\n\", prp.pr_fname ); */ \r\n                    if ( !strcmp( prp.pr_fname, name ) )  /* 这里是相对路径,而且 \r\n不带参数 */ \r\n                    { \r\n                        pid = ( pid_t )atoi( dirEntry->;d_name ); \r\n                        if ( skipit != -1 && pid == skipit )  /* -1做为无效pid对 \r\n待 */ \r\n                        { \r\n                            pid = -1; \r\n                        } \r\n                        else  /* 找到匹配 */ \r\n                        { \r\n                            close( fd ); \r\n                            break;  /* 跳出while循环 */ \r\n                        } \r\n                    } \r\n                } \r\n                close( fd ); \r\n            } \r\n        } \r\n    }  /* end of while */ \r\n    closedir( dirHandle ); \r\n    return( pid ); \r\n}  /* end of getpidbyname */ \r\n\r\nstatic void usage ( char * arg ) \r\n{ \r\n    fprintf( stderr, \" Usage: %s <proc_name>;\\n\", arg ); \r\n    exit( EXIT_FAILURE ); \r\n}  /* end of usage */ \r\n\r\nint main ( int argc, char * argv[] ) \r\n{ \r\n    pid_t pid; \r\n\r\n    if ( argc != 2 ) \r\n    { \r\n        usage( argv[0] ); \r\n    } \r\n    pid = getpidbyname( argv[1], -1 ); \r\n    if ( pid != -1 ) \r\n    { \r\n        fprintf( stderr, \"[ %s ] is: <%u>;\\n\", argv[1], ( unsigned int )pid ); \r\n        exit( EXIT_SUCCESS ); \r\n    } \r\n    exit( EXIT_FAILURE ); \r\n}  /* end of main */ \r\n-------------------------------------------------------------------------- \r\n\r\n这种技术要求运行者拥有root权限,否则无法有效获取非自己拥有的进程PID。注意 \r\n下面的演示 \r\n\r\n# ps -f -p 223 \r\n\r\nUID   PID  PPID  C    STIME TTY      TIME CMD \r\nroot   223     1  0   3月 09 ?        0:00 /usr/sbin/vold \r\n\r\n# ./getpid /usr/sbin/vold  <-- 这个用法无法找到匹配 \r\n# ./getpid vold            <-- 只能匹配相对路径 \r\n[ vold ] is: <223>; \r\n\r\n当然你可以自己修改、增强程序,使之匹配各种命令行指定,我就不替你做了。上述 \r\n程序在32-bit kernel的Solaris 2.6和64-bit kernel的Solaris 7上均测试通过。
复制代码

论坛徽章:
0
12 [报告]
发表于 2003-12-03 08:41 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
13 [报告]
发表于 2003-12-03 09:13 |只看该作者

如何检测进程是否存在?

谢谢各位,我现在就去试试!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP