리눅스 / proc/PID/ 파일을 이용하여 pid구하기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/procfs.h>
#include <sys/signal.h>
#include <dirent.h>
#define DEF_PROC_DIR "/proc"
#define DEF_PROC_NAME_LEN 128
pid_t fnGetPidByProcName(char *szInProcName)
{
int fd;
int pid;
int status;
DIR *dirp;
struct dirent *direntp;
char *dname;
char fname[256];
char pname[256];
struct stat st;
if( (dirp = opendir(DEF_PROC_DIR)) == NULL ){
fprintf(stderr,"[fnGetPidByProcName()] ERROR_FAIL opendir fail[%s] errno[%d][%s]\n", DEF_PROC_DIR, errno, strerror(errno));
return (-1);
}
while( (direntp = readdir(dirp)) != NULL ){
dname = direntp->d_name;
if(!isdigit(*dname)) continue;
pid = atoi(dname);
memset(fname, 0x00, sizeof(fname));
sprintf(fname, "/proc/%d/cmdline", pid);
/* get the process owner */
status = stat( fname, &st );
if(status != 0) continue;
if( st.st_uid != getuid() ){
continue;
}
fd = open(fname, O_RDONLY);
if( fd < 0 ){
continue;
}
else{
memset( pname, 0x00, sizeof(pname) );
if( read(fd, pname, DEF_PROC_NAME_LEN-1) < 0 ){
close(fd);
continue;
}
else{
close(fd);
if( !strcasecmp(szInProcName, pname) ){
fprintf(stderr,"[fnGetPidByProcName()] szInProcName[%s] pname[%s] pid[%d]\n", szInProcName, pname, pid);
closedir( dirp );
return (pid);
}
}
}
}
closedir( dirp );
return (-1);
}
int fnGetPidExistCheck(int pid)
{
DIR *dirp;
struct dirent *direntp;
if( (dirp = opendir(DEF_PROC_DIR)) == NULL ){
fprintf(stderr,"[fnGetPidExistCheck()] ERROR_FAIL opendir fail[%s] errno[%d][%s]\n", DEF_PROC_DIR, errno, strerror(errno));
return 0;
}
while( (direntp = readdir(dirp)) != NULL ){
if( pid == atoi(direntp->d_name) ){
closedir(dirp);
return (1);
}
}
closedir(dirp);
return (0);
}