- 论坛徽章:
- 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上均测试通过。
复制代码 |
|