Linux的ps簡單實現

原理:遍歷下的/proc/%s/task/%s/status所有文件,兩個%s都為pid號。
注:多線程下,只打印一個pid/task下的所有目錄,即可收集各個線程對應的信息。

$ cat ps.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <fcntl.h>
#define MAX 1024
#define PATH_SIZE 128char *print_char(char *str, int length)
{static char buf[MAX] = {0};int i = strlen(str);int j = 0;memset(buf, 0, strlen(buf));for (i = 0; i < length; i++) {/* 跳過‘\t’,輸出狀態信息 */if (str[i] == ' ' || str[i] == '\t'|| str[i] == '\n' || str[i] == '\r') {continue;}buf[j++] = str[i];}buf[j] = 0;return buf;
}void open_file_and_print_info(const char *path)
{char buf[MAX] = {0};FILE *fp = NULL;const char *title = NULL;//printf("path: %s\n", path);/* 打開文件 */fp = fopen(path, "r");if (fp == NULL) {perror("Failed to open path");exit(1);}/* 讀取每一行 */while (fgets(buf, MAX, fp) != NULL) {title = "Name:";if(strncmp(buf, title, strlen(title)) == 0) {printf("%-40.40s",print_char(&buf[strlen(title)], strlen(buf) - strlen(title)));continue;}title = "Pid:";if (strncmp(buf, title, strlen(title)) == 0) {printf("%-10.10s",print_char(&buf[strlen(title)], strlen(buf) - strlen(title)));continue;}title =  "Cpus_allowed_list:";if (strncmp(buf, title, strlen(title)) == 0) {printf("%-10.10s",print_char(&buf[strlen(title)], strlen(buf) - strlen(title)));printf("\n");continue;}}/* 關閉stattus文件 */fclose(fp);
}void handle_dir(const char *dir_name)
{DIR *dir = NULL;struct dirent *entry = NULL;char file[PATH_SIZE] = {0};/* 打開目錄 */if ((dir = opendir(dir_name)) == NULL) {perror("fail to open dir");return;}while ((entry = readdir(dir)) != NULL) {/* 跳過當前目錄 */if (entry->d_name[0] == '.') {continue;}/* 跳過系統信息目錄,所有進程的目錄全都是數字,而系統信息目錄全都不是數字 */if ((entry->d_name[0] <='0' ) || (entry->d_name[0] >= '9')) {continue;}/* 使用sprintf完成拼接路徑,其中%s會由entry->d_name表示的子線程ID替代 */memset(file, 0, strlen(file));snprintf(file, strlen(file) - 1, "%s/%s/status", dir_name, entry->d_name);open_file_and_print_info(file);}/* 關閉目錄 */closedir(dir);
}int main(int argc, char *argv[])
{DIR *dir = NULL;struct dirent *entry = NULL;char path[PATH_SIZE] = {0};/* 輸出表頭 */printf("%-40.40s%-10.10s%-10.10s\n", "NAME", "PID", "CPU_LIST");/* 打開/proc目錄 */if ((dir = opendir("/proc")) == NULL ) {perror("Failed to open dir");return -1;}while ((entry = readdir(dir)) != NULL) {/* 跳過當前目錄,proc目錄沒有父目錄 */if (entry->d_name[0] == '.') {continue;}/* 跳過系統信息目錄,所有進程的目錄全都是數字,而系統信息目錄全都不是數字 */if ((entry->d_name[0] <='0' ) || (entry->d_name[0] >= '9')) {continue;}memset(path, 0, strlen(path));
#if 0/* 使用sprintf完成拼接路徑,其中兩個%s會由entry->d_name表示的進程ID替代 */snprintf(path, strlen(path) - 1, "/proc/%s/task/%s/status", entry->d_name,entry->d_name);open_file_and_print_info(path);
#else/* 使用sprintf完成拼接路徑,其中%s會由entry->d_name表示的進程ID替代 */snprintf(path, strlen(path) - 1, "/proc/%s/task", entry->d_name);handle_dir(path);
#endif}/* 關閉目錄 */closedir( dir );return 0;
}

編譯:

$ gcc ps.c -o ps

運行:

$ ./ps
NAME                                    PID       CPU_LIST
systemd                                 1         0-5
kthreadd                                2         0-5
rcu_gp                                  3         0-5
rcu_par_gp                              4         0-5
kworker/0:0H                            6         0
mm_percpu_wq                            8         0-5
rcu_sched                               10        0-5
migration/0                             11        0
idle_inject/0                           12        0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214797.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214797.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214797.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《深入理解計算機系統》學習筆記 - 第四課 - 機器級別的程序

Lecture 05 Machine Level Programming I Basics 機器級別的程序 文章目錄 Lecture 05 Machine Level Programming I Basics 機器級別的程序intel 處理器的歷史和體系結構芯片的構成AMD 公司(Advanced Micro Devices&#xff0c;先進的微型設備) C, 匯編, 機器代碼定義匯編/機器…

2024美賽備戰1--數據處理(數據預處理,異常值處理,預測模型,插值擬合 *****必看****)

1.數據預處理 所謂數據預處理&#xff0c;就是指在正式做題之前對數據進行的一些處理。在有些情 況下&#xff0c;出題方提供的數據或者網上查找的數據并不能直接使用&#xff0c;比如缺少數據甚 至是異常數據&#xff0c;如果直接忽略缺失值&#xff0c;或者沒發現異常數據&am…

angular material mat-error 失效不展示

1.你命名了控制mat-error顯示與否的變量&#xff0c;卻沒有在html里使用 2.mat-error是放在mat-form-field里才生效的&#xff0c;如果 <input matInput required formControlName"phoneNumber" /> 中的phoneNumber其實是valid&#xff0c;通過驗證的&#x…

【KALI】設置靜態IP地址

ip: 192.168.1.10/24 網關&#xff1a;192.168.1.1 DNS&#xff1a;192.168.1.254/etc/network/interfaces原始文件內容為&#xff1a; # This file describes the network interfaces available on your system # and how to activate them. For more information, see inter…

數字圖像處理(實踐篇)二十一 人臉識別

目錄 1 安裝face_recognition 2 涉及的函數 3 人臉識別方案 4 實踐 使用face_recognition進行人臉識別。 1 安裝face_recognition pip install face_recognition 或者 pip --default-timeout100 install face_recognition -i http://pypi.douban.com/simple --trusted-…

川崎ZX-6R確定引進,636它真的來了,3C認證已過。

最新消息&#xff0c;兄弟們&#xff0c;你們期待已久的川崎ZX6R&#xff08;636&#xff09;基本已經確定引進了&#xff0c;官方的3C認證已經通過&#xff0c;那么從3C里面我們可以看到哪幾個信息&#xff1f;產品代號ZX636J就是心心念念的ZX-6R了。 有些小伙伴不太清楚3C認…

t-SNE完整筆記 (附Python代碼)

t-SNE(t-distributed stochastic neighbor embedding)是用于降維的一種機器學習算法&#xff0c;是由 Laurens van der Maaten 和 Geoffrey Hinton在08年提出來。此外&#xff0c;t-SNE 是一種非線性降維算法&#xff0c;非常適用于高維數據降維到2維或者3維&#xff0c;進行可…

laravel定時任務配置手冊

任務調度在 app/Console/Kernel.php 的 schedule 方法中進行定義&#xff1b; 分配多種調度計劃&#xff1a;結合其他一些特定條件&#xff0c;我們可以生成在一周中特定時間運行的任務。舉個例子&#xff0c;在每周一執行命令&#xff1a; 方法 描述 ->cron(* * * * *); …

分配棧空間的三種方式(基于適配qemu的FreeRTOS分析)

1、定義全局的數組 定義的全局數組屬于bss段&#xff0c;相當于把bss段的一部分作為棧空間&#xff0c;棧空間的大小就是數組的大小如果把棧空間放在bss段&#xff0c;則在bss段清零時會多清零一段地址空間 2、在鏈接腳本中指定 用鏈接腳本在所有段的后面增加stack段&#xff…

15:00面試,15:06就出來了,問的問題真變態。。。

剛從小廠出來&#xff0c;沒想到在另一家公司我又寄了。 在這家公司上班&#xff0c;每天都要加班&#xff0c;但看在錢給的比較多的份上&#xff0c;也就不太計較了。但萬萬沒想到5月一紙通知&#xff0c;所有人不準加班了&#xff0c;不僅加班費沒有了&#xff0c;薪資還要降…

基于springboot的大學生兼職信息管理系統(源碼+數據庫+文檔)

摘要 基于Spring Boot的大學生兼職信息管理系統是一個為大學生和兼職公司提供服務的平臺。通過該系統&#xff0c;大學生可以方便地尋找兼職工作機會&#xff0c;而兼職公司可以發布、管理和篩選合適的兼職信息。首先&#xff0c;系統采用了Spring Boot作為開發框架&#xff0…

Ubuntu22.04使能root用戶

一、背景 安裝Ubuntu22.04系統的時候&#xff0c;會要求創建一個用戶&#xff0c;并設置密碼。為方便后續行文&#xff0c;將此用戶稱為user_normal&#xff0c;此密碼稱為normal_pd 安裝Ubuntu22.04系統的時候&#xff0c;沒有出現任何和root有關的設置 Ubuntu22.04安裝完成…

[隴劍杯 2021]日志分析

[隴劍杯 2021]日志分析 題目做法及思路解析&#xff08;個人分享&#xff09; 問一&#xff1a;單位某應用程序被攻擊&#xff0c;請分析日志&#xff0c;進行作答&#xff1a; 網絡存在源碼泄漏&#xff0c;源碼文件名是_____________。(請提交帶有文件后綴的文件名&…

前端mp3文件轉wav文件的實現

一、音頻文件格式轉換 1&#xff09;安裝fluent-ffmpeg和ffmpeg插件 npm install fluent-ffmpeg; npm install ffmpeg;2&#xff09;mp3轉wav test.js文件&#xff1a; const ffmpeg require(fluent-ffmpeg);ffmpeg(./test.mp3) .format(wav) .audioBitrate(16k) .audioFre…

(純原創) 基于SSM 的商城購物系統(完整源代碼以及開發文檔)

摘要 本網上商城系統以SSM架構、使用Mybatis&#xff0c;數據庫使用MySQL&#xff0c;這些技術目前相對比較成熟&#xff0c;方便系統的維護與擴展。網上商城系統前臺包括了用戶注冊、用戶登錄、商品查詢、商品添加到購物車、刪除商品等幾大功能&#xff1b;后臺管理功能則包…

Android VpnService 使用(一)

Android VpnService 使用(一) 本篇算是VpnService 使用的第一篇文章,主要講述service創建,intent調用. 1: 申請權限 <service android:name".MyVpnService" android:permission"android.permission.BIND_VPN_SERVICE"><intent-filter><ac…

Android 7.1 默認自拍鏡像

Android 7.1 默認自拍鏡像 近來收到客戶需求反饋需要將相機前攝成像默認為鏡像顯示&#xff0c;大致思路我們可以在保存數據前將前攝拍的照片轉為鏡像&#xff0c;保存數據是通過PhotoMode.java文件中的saveData方法實現&#xff0c;具體修改參照如下&#xff1a; 首先添加將圖…

LeetCode力扣每日一題(Java):27、移除元素

一、題目 二、解題思路 1、我的思路 因為題目中說“元素的順序可以改變。你不需要考慮數組中超出新長度后面的元素。”也就是說&#xff1a; 輸入&#xff1a;nums [3,2,2,3], val 3 輸出&#xff1a;2, nums [2,2] 解釋&#xff1a;函數應該返回新的長度 2并且 nums 中的…

JVM性能調優

遇到以下情況&#xff0c;就需要考慮進行JVM調優了&#xff1a; Heap內存&#xff08;老年代&#xff09;持續上漲達到設置的最大內存值&#xff1b; Full GC 次數頻繁&#xff1b; GC 停頓時間過長&#xff08;超過1秒&#xff09;&#xff1b; 應用出現OutOfMemory 等內存異常…

xtts和ogg不選擇?

不選擇ogg的理由&#xff1a; 1.需要在源端創建用戶賦權&#xff0c;啟用數據庫最小日志&#xff0c;附加日志等操作--對生產影響較大 2.外鍵約束過多&#xff0c;割接啟用可能很慢https://www.modb.pro/db/201126--割接停機時間影響 3.初始化配置expdp導出可能快照過舊&#x…