您的位置:首页 > 运维架构 > Linux

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

2016-10-29 09:41 579 查看

该代码来源于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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 源码 linux
相关文章推荐