linux下ss命令源码学习(二):linux c代码获取后台进程名称及pid

来源:互联网 发布:打谱软件手机版 编辑:程序博客网 时间:2024/06/06 03:24

该代码来源于ss命令源码

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <syslog.h>#include <fcntl.h>#include <sys/ioctl.h>#include <string.h>#include <arpa/inet.h>#include <resolv.h>#include <dirent.h>#include <fnmatch.h>#include <dirent.h>void get_proc_pid(void) {    const char *root = "/proc/";    struct dirent *d;    char name[1024] = {0};    int nameoff = 0;    DIR *dir;    snprintf(name, sizeof (name), "%s", root);    if (strlen(name) == 0 || name[strlen(name) - 1] != '/') {        snprintf(name + strlen(name), sizeof (name) - strlen(name), "%s", "/");    }    nameoff = strlen(name);    dir = opendir(name);    if (!dir) {        return;    }    while ((d = readdir(dir)) != NULL) {        char process[16] = {0};        int pid = 0, pos = 0;        DIR *dir1;        char crap;        if (sscanf(d->d_name, "%d%c", &pid, &crap) != 1) {            continue;        }        snprintf(name + nameoff, sizeof (name) - nameoff, "%d/fd/", pid);        pos = strlen(name);        if ((dir1 = opendir(name)) == NULL) {            continue;        }        process[0] = '\0';        char tmp[1024] = {0};        FILE *fp = NULL;        snprintf(tmp, sizeof (tmp), "%s/%d/stat", root, pid);        if ((fp = fopen(tmp, "r")) != NULL) {            fscanf(fp, "%*d (%[^)])", process);            fclose(fp);        }        printf("--%s--%d\n",process, pid);        closedir(dir1);    }    closedir(dir);}int main(int argc, char *argv[]){    get_proc_pid();    return 0;}
1 0
原创粉丝点击