Linux编程入门-进程
Linux编程入门-进程
进程号
系统允许的最大进程号为“/proc/sys/kernel/pid_max”文件数值-1。查看“/proc/PID/status”文件的PPid字段可获知每个进程的父进程。若某个子进程的父进程终止,则init进程收养该进程,后去getppid
返回进程号1。
查看“/proc/PID/cmdline”文件可读取任意进程命令行参数,程序也可用“/proc/self/cmdline”访问自己的命令行参数。GNU C语言库也有提供全局变量:
1 |
|
getpid
返回调用进程的进程号:
1 |
|
getppid
返回父进程进程号:
1 | __pid_t getppid (void); |
环境
查看“/proc/PID/environ”文件可访问任意进程环境列表,每条后面以空字符结尾。main函数中的argv和environ指针数组指向的字符串都驻留在进程栈上一个单一连续的内存区域,该区域可存储的字节数上限通过sysconf
的_SC_ARG_MAX获取。
getenv
从进程环境中检索单个值:
1 | char* getenv( |
putenv
向调用进程的环境中添加一个新变量,或修改一个已存在的变量值。该函数将environ变量中某一元素的指向与string参数指向位置相同,如果随后修改string参数所指内容,将影响该进程环境,所以string不应为自动变量(在栈中分配的字符数组),以防定义此变量的函数返回后可能重写这块内存区域。当string不包含一个“\=”则从环境列表中移除string命名的环境变量。
1 | int putenv ( |
setenv
向环境中添加一个变量,可代替putenv
。该函数为“name\=value”字符串分配一块内存缓冲区并将name和value所指字符串复制到这里,创建一个新的环境变量,不需要手动添加“\=”。若name变量已存在且overwrite为0,则不改变环境,overwrite为非0则总是改变环境。
1 | int setenv ( |
unsetenv
从环境中移除name标识的变量,不含“\=”。
1 | int unsetenv ( |
clearenv
清除环境。
1 |
|
非局部跳转
非局部跳转指跳转目标为当前执行函数之外的某个位置。该小节使用时建议不要启用编译优化,必要局部变量建议使用volatile关键字,用-Wextra选项可提示本小节相关部分警告信息。
setjmp/longjmp
setjmp
调用为后续longjmp
调用确立了跳转目标。setjmp
将当前进程环境各种信息保存到env参数中,调用longjmp
时将发起longjmp
调用的函数与之前调用setjmp
函数之间的函数栈帧从栈上剥离,称为解栈。
1 |
|
例子如下:
1 |
|
结果大概为:
1 | ./longjmp |