'2025/03/02'에 해당되는 글 2건

  1. 2025.03.02 C언어 리눅스 프로세서 이름을 이용하여 PID구하기

반응형

리눅스 / 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);

}

 

 

반응형
Posted by 공간사랑
,