C 语言 Linux查找某一进程,Linux查找某一进程的PID(c语言)

这篇博客介绍了如何在Linux系统中通过/proc文件系统查找指定名称的进程PID。代码实现了大小写不敏感的字符串比较,并能区分精确匹配和部分匹配。通过遍历/proc目录下以数字命名的子目录,读取cmdline文件获取进程命令行参数,进一步判断是否匹配目标进程名称。
摘要由CSDN通过智能技术生成

#include

<

unistd.h

>

#include

<

dirent.h

>

#include

<

sys

/

types.h

>

//

for opendir(), readdir(), closedir()

#include

<

sys

/

stat.h

>

//

for stat()

#include

<

stdio.h

>

#include

<

stdlib.h

>

#include

<

string

.h

>

#include

<

stdarg.h

>

#define

PROC_DIRECTORY "/proc/"

#define

CASE_SENSITIVE 1

#define

CASE_INSENSITIVE 0

#define

EXACT_MATCH 1

#define

INEXACT_MATCH 0

//

是不是数字

int

IsNumeric(

const

char

*

ccharptr_CharacterList) {

for

( ;

*

ccharptr_CharacterList; ccharptr_CharacterList

++

)

if

(

*

ccharptr_CharacterList

<

'

0

'

||

*

ccharptr_CharacterList

>

'

9

'

)

return

0

;

//

false

return

1

;

//

true

}

//

intCaseSensitive=0大小写不敏感

int

strcmp_Wrapper(

const

char

*

s1,

const

char

*

s2,

int

intCaseSensitive) {

if

(intCaseSensitive)

return

!

strcmp(s1, s2);

else

return

!

strcasecmp(s1, s2); }

//

intCaseSensitive=0大小写不敏感

int

strstr_Wrapper(

const

char

*

haystack,

const

char

*

needle,

int

intCaseSensitive) {

if

(intCaseSensitive)

return

(

int

) strstr(haystack, needle);

else

return

(

int

) strcasestr(haystack, needle); } pid_t GetPIDbyName_implements(

const

char

*

cchrptr_ProcessName,

int

intCaseSensitiveness,

int

intExactMatch) {

char

chrarry_CommandLinePath[

100

] ;

char

chrarry_NameOfProcess[

300

] ;

char

*

chrptr_StringToCompare

=

NULL ; pid_t pid_ProcessIdentifier

=

(pid_t)

-

1

;

struct

dirent

*

de_DirEntity

=

NULL ; DIR

*

dir_proc

=

NULL ;

int

(

*

CompareFunction) (

const

char

*

,

const

char

*

,

int

) ;

if

(intExactMatch) CompareFunction

=

&

strcmp_Wrapper;

else

CompareFunction

=

&

strstr_Wrapper; dir_proc

=

opendir(PROC_DIRECTORY) ;

if

(dir_proc

==

NULL) { perror(

"

Couldn't open the

"

PROC_DIRECTORY

"

directory

"

) ;

return

(pid_t)

-

2

; }

//

Loop while not NULL

while

( (de_DirEntity

=

readdir(dir_proc)) ) {

if

(de_DirEntity

->

d_type

==

DT_DIR) {

if

(IsNumeric(de_DirEntity

->

d_name)) { strcpy(chrarry_CommandLinePath, PROC_DIRECTORY) ; strcat(chrarry_CommandLinePath, de_DirEntity

->

d_name) ; strcat(chrarry_CommandLinePath,

"

/cmdline

"

) ; FILE

*

fd_CmdLineFile

=

fopen (chrarry_CommandLinePath,

"

rt

"

) ;

//

open the file for reading text

if

(fd_CmdLineFile) { fscanf(fd_CmdLineFile,

"

%s

"

, chrarry_NameOfProcess) ;

//

read from /proc//cmdline

fclose(fd_CmdLineFile);

//

close the file prior to exiting the routine

if

(strrchr(chrarry_NameOfProcess,

'

/

'

)) chrptr_StringToCompare

=

strrchr(chrarry_NameOfProcess,

'

/

'

)

+

1

;

else

chrptr_StringToCompare

=

chrarry_NameOfProcess ;

//

printf("Process name: %s\n", chrarry_NameOfProcess);

//

这个是全路径,比如/bin/ls

//

printf("Pure Process name: %s\n", chrptr_StringToCompare );

//

这个是纯进程名,比如ls

//

这里可以比较全路径名,设置为chrarry_NameOfProcess即可

if

( CompareFunction(chrptr_StringToCompare, cchrptr_ProcessName, intCaseSensitiveness) ) { pid_ProcessIdentifier

=

(pid_t) atoi(de_DirEntity

->

d_name) ; closedir(dir_proc) ;

return

pid_ProcessIdentifier ; } } } } } closedir(dir_proc) ;

return

pid_ProcessIdentifier ; }

//

简单实现

pid_t GetPIDbyName_Wrapper(

const

char

*

cchrptr_ProcessName) {

return

GetPIDbyName_implements(cchrptr_ProcessName,

0

,

0

);

//

大小写不敏感

}

int

main() { pid_t pid

=

GetPIDbyName_Wrapper(

"

bash

"

) ;

//

If -1 = not found, if -2 = proc fs access error

printf(

"

PID %d\n

"

, pid);

return

EXIT_SUCCESS ; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值