linux获取进程id和进程名称作为一个共享库,应该需要统计使用本库的各种应用程序的使用频率,使用方法等信息。才能针对主要应用做出更好的改进。
专注于为中小企业提供网站制作、成都做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业灯塔免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
那么就需要记录调用者的进程id或者进程名称,并且保存下来。保存的动作可以采用共享内存,也可以采用文件,这个在下篇博文描述,本文描述如何获取进程id和进程名称。范例:#include
stdio.h#include
unistd.h#define
CFGMNG_TASK_NAME_LEN
256int
main(){
int
ret;
char
ac_tmp[CFGMNG_TASK_NAME_LEN];
ret
=
cfgmng_get_taskname(ac_tmp,
CFGMNG_TASK_NAME_LEN);
if
(0
!=
ret)
{
printf(Call
cfgmng_get_taskname
fail./n);
return
-1;
}
printf(The
running
task
name
is
%s./n,
ac_tmp);
return
0;}int
cfgmng_get_taskname(char
*ac,
int
len){
int
count
=
0;
int
nIndex
=
0;
char
chPath[CFGMNG_TASK_NAME_LEN]
=
{0};
char
cParam[100]
=
{0};
char
*cTem
=
chPath;
int
tmp_len;
pid_t
pId
=
getpid();
sprintf(cParam,/proc/%d/exe,pId);/*
printf(cParam
=
%s./n,
cParam);*/
count
=
readlink(cParam,
chPath,
CFGMNG_TASK_NAME_LEN);/*
printf(count
=
%d./n,
count);*/
if
(count
||
count
=
CFGMNG_TASK_NAME_LEN)
{
printf(Current
System
Not
Surport
Proc./n);
return
-1;
}
else
{
nIndex
=
count
-
1;
for(
;
nIndex
=
0;
nIndex--)
{
if(
chPath[nIndex]
==
'/'
)//筛选出进程名
{
nIndex++;
cTem
+=
nIndex;
break;
}
}
}
tmp_len
=
strlen(cTem);
if
(0
==
tmp_len)
{
printf(Get
task
fail./n);
return
-1;
}
if
(len
=
tmp_len
+1)
{
printf(len(%d)
is
less
than
taskname(%s)'s
len./n,
len,
cTem);
return
-1;
}
strcpy(ac,
cTem);
return
0;}从上面的实验范例可以看出,主要使用的函数是getpid获取本进程的id,再到/proc/pid/exe
中去找到对应的进程名称。在/proc目录中有很多跟进程相关的东西,都可以用这种方法触类旁通地实现。
华为路由器基本配置命令:
en 进入特权模式
conf 进入全局配置模式
in s0 进入 serial 0 端口配置
ip add xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx 添加ip 地址和掩码,电信分配
enca hdlc/ppp 捆绑链路协议 hdlc 或者 ppp
ip unn e0
exit 回到全局配置模式
in e0 进入以太接口配置
ip add xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx 添加ip 地址和掩码,电信分配
exit 回到全局配置模式
ip route 0.0.0.0 0.0.0.0 s 0 添加路由表
ena password 口令
write
exit
以上根据中国电信 ddn 专线多数情况应用
普通用户模式
enable 转入特权用户模式
exit 退出配置
help 系统帮助简述
language 语言模式切换
ping 检查网络主机连接及主机是否可达
show 显示系统运行信息
telnet 远程登录功能
tracert 跟踪到目的地经过了哪些路由器
特权用户模式
#?
clear 清除各项统计信息
clock 管理系统时钟
configure 进入全局配置模式
debug 开启调试开关
disable 返回普通用户模式
download 下载新版本软件和配置文件
erase 擦除FLASH中的配置
exec-timeout 打开EXEC超时退出开关
exit 退出配置
first-config 设置或清除初次配置标志
help 系统帮助简述
language 语言模式切换
monitor 打开用户屏幕调试信息输出开关
no 关闭调试开关
ping 检查网络主机连接及主机是否可达
reboot 路由器重启
setup 配置路由器参数
show 显示系统运行信息
telnet 远程登录功能
tracert 跟踪到目的地经过了哪些路由器
unmonitor 关闭用户屏幕调试信息输出开关
write 将当前配置参数保存至FLASH MEM中
全局配置模式
aaa-enable 使能配置AAA(认证,授权和计费)
access-list 配置标准访问表
arp 设置静态ARP人口
chat-script 生成一个用在modem上的执行脚本
custom-list 创建定制队列列表
dialer-list 创建dialer-list
dram-wait 设置DRAM等待状态
enable 修改ENABLE口令
exit 退出全局配置模式
firewall 配置防火墙状态
flow-interval 设置流量控制时间间隔
frame-relay 帧中继全局配置命令集
ftp-server FTP 服务器
help 系统帮助命令简述
host 添加主机名称和其IP地址
hostname 修改主机名
ifquelen 更改接口队列长度
interface 选择配置接口
ip 全局IP配置命令子集
ipx 全局IPX配置命令子集
loghost 设置日志主机IP地址
logic-channel 配置逻辑通道
login 启动EXEC登录验证
modem-timeout 设置 modem 超时时间
multilink 配置multilink 用户使用的接口
multilink-user 配置multilink 用户使用的接口
natserver 设置FTP,TELNET,WWW服务的IP地址
no 关闭某些参数开关
priority-list 创建优先级队列列表
router 启动路由处理
settr 设置时间范围
snmp-server 修改SNMP参数
tcp 配置全局TCP参数
timerange 启动或关闭时间区域
user 为PPP验证向系统中加入用户
vpdn 设置VPDN
vpdn-group 设置VPDN组
x25 X.25协议分组层
路由器以太网口配置命令
2.1.1 description
设置以太网口描述。
description ethernet-description
no description
在大多数系统,gdb对使用fork创建的进程没有进行特别的支持。当父进程使用fork创建子进程,gdb仍然只会调试父进程,而子进程没有得到控制和调试。这个时候,如果你在子进程执行到的代码中设置了断点,那么当子进程执行到这个断点的时候,会产生一个SIGTRAP的信号,如果没有对此信号进行捕捉处理,就会按默认的处理方式处理——终止进程。
当然,你可以使用时间延迟的方法,在子进程fork出来之后,使用Sleep函数等待一段时间再运行,在这段时间中你使用ps找到该进程,然后使用Attach方法把该进程附加到gdb中,从而达到可以调试子进程的目的。
在一部分系统中(我使用的是基于2.6内核的CentOS,支持follow-fork和detach-on-fork模式),比如HP-UX11.x之后的版本,Linux2.5.60之后的版本,可以使用以下的方法来达到方便的进行多进程调试功能。
默认情况下,父进程fork一个子进程,gdb只会继续调试父进程而不会管子进程的运行。
如果你想跟踪子进程进行调试,可以使用set follow-fork-mode mode来设置fork跟随模式。
set follow-fork-mode 所带的mode参数可以是以下的一种:
parent
gdb只跟踪父进程,不跟踪子进程,这是默认的模式。
child
gdb在子进程产生以后只跟踪子进程,放弃对父进程的跟踪。
进入gdb以后,我们可以使用show follow-fork-mode来查看目前的跟踪模式。
可以看到目前使用的模式是parent。
然而,有的时候,我们想同时调试父进程和子进程,以上的方法就不能满足了。Linux提供了set detach-on-fork mode命令来供我们使用。其使用的mode可以是以下的一种:
on
只调试父进程或子进程的其中一个(根据follow-fork-mode来决定),这是默认的模式。
off
父子进程都在gdb的控制之下,其中一个进程正常调试(根据follow-fork-mode来决定)
另一个进程会被设置为暂停状态。
同样,show detach-on-fork显示了目前是的detach-on-fork模式,如上图。
以上是调试fork产生子进程的情况,但是如果子进程使用exec系统函数而装载了新程序执行呢?——我们使用set follow-exec-mode mode提供的模式来跟踪这个exec装载的程序。mode可以是以下的一种:
new 当发生exec的时候,如果这个选项是new,则新建一个inferior给执行起来的子进程,而父进程的inferior仍然保留,当前保留的inferior的程序状态是没有执行。
same 当发生exec的时候,如果这个选项是same(默认值),因为父进程已经退出,所以自动在执行exec的inferior上控制子进程。
我们可以使用apue里面第8章的例子代码来做测试:
#include "apue.h"
intglob = 6;/* external variable in initialized data */
charbuf[] = "a write to stdout\n";
int
main(void)
{
intvar;/* automatic variable on the stack */
pid_tpid;
var = 88;
if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)
err_sys("write error");
printf("before fork\n");/* we don't flush stdout */
if ((pid = fork()) 0) {
err_sys("fork error");
} else if (pid == 0) {/* child */
glob++;/* modify variables */
var++;
} else {
sleep(2);/* parent */
}
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
}