Linux c 进程名 pid,Linux C已知进程名字得到其PID号

最近需要实现一个功能,即在一个Linux C程序中,已知其他进程的名字,需要获得该进程的PID,经过一番上网搜索,找到两种可行的方法:

1.通过popen创建一个管道,执行shell命令并得到返回结果

2.通过搜索/proc文件夹下的文件内容,得到进程PID(顺带演示一下Linux C中如何读取一个文件夹中的内容)

为了方便进行测试,首先随便写了一段代码如下:

#include

void main()

{

char c;

scanf("%c", &c);

}

将代码编译为二进制文件test,并使用./test运行,由于该代码中由于有scanf函数存在,会一直阻塞,下面就可以运行其它程序来查询这个进程的PID了。

一、通过popen的方法

我们知道,在shell下可以通过下述命令来得到进程test的PID:

ps -e | grep 'test' | awk '{print $1}'

(注:这个命令中,名字中含有test字样的进程都会被扫描到,如果只针对名字恰好为test的进程,则需要修改这个命令)

那么在Linux C程序中,只要将这个命令移到shell环境中执行一下,并读取其执行结果即可。在Linux C程序中执行shell命令可以通过popen函数,该函数会返回一个文件指针,可以像操作文件一样对这个返回的指针进行操作。关于popen函数的细节,网上一搜一大把,这里就不说了,直接上代码:

#include

#include

void main()

{

FILE *fp = popen("ps -e | grep \'test\' | awk \'{print $1}\'", "r");//打开管道,执行shell 命令

char buffer[10] = {0};

while (NULL != fgets(buffer, 10, fp)) //逐行读取执行结果并打印

{

printf("PID: %s", buffer);

}

pclose(fp); //关闭返回的文件指针,注意不是用fclose噢

}

二、通过搜索/proc文件夹下的内容获取进程PID

在系统的/proc文件夹下,保存有系统当前所有进程的信息,比如一个进程的PID为10000,那么/proc下会有一个名字为10000的文件夹,其中包含有该进程的几乎所有信息:其中/proc/10000/cmdline文件中保存了启动该进程时使用的命令行。

由于刚才的进程是通过./test运行的,因此只要遍历/proc下的文件夹,如果发现某个文件夹中的cmdline文件内容为./test,则该文件夹的名字即为进程的PID,代码如下:

#include

#include

#include

void main()

{

DIR *dir;

struct dirent *ptr;

FILE *fp;

char filepath[50];//大小随意,能装下cmdline文件的路径即可

char filetext[50];//大小随意,能装下要识别的命令行文本即可

dir = opendir("/proc"); //打开路径

if (NULL != dir)

{

while ((ptr = readdir(dir)) != NULL) //循环读取路径下的每一个文件/文件夹

{

//如果读取到的是"."或者".."则跳过,读取到的不是文件夹名字也跳过

if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0)) continue;

if (DT_DIR != ptr->d_type) continue;

sprintf(filepath, "/proc/%s/cmdline", ptr->d_name);//生成要读取的文件的路径

fp = fopen(filepath, "r");//打开文件

if (NULL != fp)

{

fread(filetext, 1, 50, fp);//读取文件

filetext[49] = '\0';//给读出的内容加上字符串结束符

//如果文件内容满足要求则打印路径的名字(即进程的PID)

if (filetext == strstr(filetext, "./test")) printf("PID: %s\n", ptr->d_name);

fclose(fp);

}

}

closedir(dir);//关闭路径

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode笔记】114. 二叉树展开为链表(Java、递归)

文章目录题目描述解法 & 思路思路一思路二题目描述 我佛了,这道题挺描述不明的,有坑,过不了oj建议马上看评论 or 题解 解法 & 思路 思路一 代码就不贴了,过不去先序遍历,按序存储val到一个ArrayList。然后用…

【LeetCode笔记】136. 只出现一次的数字(Java、位运算)

文章目录题目描述代码 & 思路题目描述 评论区一个评论很不错:不用额外空间,首先考虑位运算。 代码 & 思路 异或 ^ :相同得0与0得本身满足交换律那么好办了,abcdeabcd > aabbccdde > 0 0 0 0 e > e class So…

linux脚本写的计算器,一步步打造自己的linux命令行计算器

相信很多人,在工作中会需要使用到计算器。一般的做法是,打开并使用系统自带的计算器。这种做法可能对我来说,有如下几个问题。太慢。每次需要打开计算器,然后改成编程模式,手工选择进制,再使用输入表达式进…

【LeetCode笔记】141. 环形链表(Java、快慢指针、链表)

文章目录题目描述思路 & 代码题目描述 常见题,用上了久违的快慢指针 思路 & 代码 举个例子就能明白了:我和汽车,进行一场比赛,跑道可能是环形跑道,也可能是直道。直道的话,将会以汽车撞到终点为…

linux3.x内核实时性改进,linux 3.x内核优化指南

1.1。Numba的约5分钟指南 Numba是Python的即时编译器,它最适用于使用NumPy数组和函数以及循环的代码。使用Numba的最常用方法是通过其装饰器集合,可以应用于您的函数来指示Numba编译它们。当调用Numba修饰函数时,它被编译为机器代码“及时”执…

linux 控制终端卡,配置通过串口控制linux操作系统的终端

开始之前,请确认机器有串口(com口, RS232接口),如果没有,那就没有办法达到通过串口控制机器的目的了。当然,也可以额外给机器安装一个带串口的 PCI 模块,然后想办法将模块驱动起来(内核默认能驱动就最好了)&#xff0c…

【LeetCode笔记】169. 多数元素(Java、摩尔投票法、哈希表)

文章目录题目描述思路 & 代码思路一&#xff1a;哈希表思路二&#xff1a; 摩尔投票法题目描述 好家伙&#xff0c;这是今天最有意思的题目了 思路 & 代码 思路一&#xff1a;哈希表 先说缺点&#xff1a;空间复杂度O(n)一次遍历&#xff0c;记录<数组存储值&a…

Linux环境下怎么使用pip,linux下pip的安装步骤及使用详解

linux下pip的安装步骤及使用详解pip类似RedHat里面的yum&#xff0c;安装软件非常方便。下面话不多说&#xff0c;来看看详细的介绍&#xff1a;pip下载&#xff1a;# wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5834b2904f92d46aaa33326pi…

【LeetCode笔记】206. 反转链表(Java、迭代、递归、链表)

啊好久没更文了&#xff0c;前两天状态不太好。还是要坚持更文敲题噢&#xff01; 文章目录题目描述思路 & 代码题目描述 面试高频题&#xff0c;需要会用两种方法解决&#xff01;&#xff08;迭代 and 递归&#xff09;其实先写出迭代&#xff0c;递归就不难写了。 思…

当你抛弃windows使用linux,当我们厌倦了Windows系统还能考虑什么样的桌面操作系统?...

如果你厌倦了Windows&#xff0c;我们该选择什么样的操作系统&#xff1f;时间告诉我们&#xff0c;任何事物都不会一成不变&#xff0c;当我们厌倦了Windows那天到来&#xff0c;不妨考虑换个操作系统&#xff0c;即便Windows操作系统在市场依然如日中天&#xff0c;旧的不去新…

【LeetCode笔记】234. 回文链表(Java、快慢指针、链表)

文章目录题目描述思路 & 算法题目描述 写这道题前最好把206.翻转链表 写了有空间复杂度的话都好说&#xff0c;不管是新建链表、还是用字符串equals都好做。 思路 & 算法 快慢指针&#xff1a; 快指针找终点&#xff0c;慢指针反转前半个链表快指针回到慢指针的位…

vs2010 编译linux,VS2010 Boost编译安装

2.解压缩到D:\boost 目录下3.编译bjam(1)从vs2010的工具菜单进入命令提示窗口(单击“开始”按钮&#xff0c;指向“所有程序”&#xff0c;指向“Microsoft Visual Studio 2010”&#xff0c;指向“Visual Studio tools(工具)”&#xff0c;然后单击“Visual Studio 2010 comma…

【LeetCode笔记】200. 岛屿数量(Java、DFS)

文章目录题目描述代码 & 思路更新代码题目描述 直接毁岛&#xff01;每次发现一个岛&#xff0c;ans&#xff0c;然后直接把整个岛毁了&#xff08;感染&#xff09;直到最后&#xff0c;找出所有岛&#xff0c;此时地图上全都是’0’ 代码 & 思路 每次找到一个岛&…

linux统计代码注释率,统计代码注释率

#!/bin/bash#program:# 分析.c,.cpp文件,计算文件行总数&#xff0c;代码行总数&#xff0c;注释行总数&#xff0c;空白行总数&#xff0c;代码注释率# 注释类型&#xff1a;# (1)行注释"//这里是注释内容"# (2)块注释"/*这里是注释内…

【LeetCode笔记】155. 最小栈(Java、栈)

文章目录题目描述思路 & 代码更新版题目描述 用空间换时间的经典例子&#xff0c;唯一要解决的地方就是 getMin() 如何实现常数检索&#xff08;貌似也是面试常考题&#xff09; 思路 & 代码 既然想快&#xff0c;那就要付出空间的代价用什么空间可以实现&#xff…

linux win7 默认启动,请教:我的grub.cfg里面的内容如下,请教怎样改代码才能让WIN7设为默认启动...

请教&#xff1a;我的grub.cfg里面的内容如下&#xff0c;请教怎样改代码才能让WIN7设为默认启动发布时间:2011-09-24 15:43:24来源:红联作者:baiguanglin## DO NOT EDIT THIS FILE## It is automatically generated by grub-mkconfig using templates# from /etc/grub.d and s…

【LeetCode笔记】198. 打家劫舍(Java、动态规划)

文章目录题目描述思路 & 代码更新版题目描述 好家伙&#xff0c;真是一道不符合社会主义价值观的题目不过我们还是要把这道题做了&#xff0c;而且还得用上动态规划 思路 & 代码 首先&#xff0c;不能打劫相邻然后&#xff0c;房屋都是非负整数&#xff08;讲道理&…

【LeetCode笔记】617. 合并二叉树(Java、DFS、二叉树)

文章目录题目描述思路 & 代码更新版题目描述 貌似是面试高频题&#xff0c;显而易见的递归。 思路 & 代码 合并两棵树&#xff0c;先不考虑特殊情况&#xff0c;可以理解成&#xff1a;根结点合并&#xff0c;然后各自的左右子树继续进行合并操作。那么递归返回值肯…

linux 重定向 不换行,Ada:重定向到stdout时省略换行符(测试Put)

我正在尝试用简单的方法编写测试Ada.Text_IO.Put.为简单起见,这是一个我想测试的组合方法:procedure Say_Something isbeginPut("Something.");end Say_Something;在我的AUnit测试中,我有:procedure Test_Put (T : in out Test) ispragma Unreferenced (T);use Ada.T…

【LeetCode笔记】226. 翻转二叉树(Java、递归)

文章目录题目描述代码 & 思路更新版题目描述 感觉和合并二叉树类似&#xff0c;都是很好进行递归的问题 代码 & 思路 翻转当前结点的左、右结点对当前结点的左、右结点进行翻转函数【自底向上】 /*** Definition for a binary tree node.* public class TreeNode …