进程概要
来源:互联网 发布:win10怎么更改公用网络 编辑:程序博客网 时间:2024/05/16 15:34
C程序内存布局
进程退出函数
void _exit(int status);
void _Exit(int status);
voit exit(int status);
void atexit(void (*func)()); // 注册进程退出时调用的函数
函数内跳转
使用goto语句即可实现函数内跳转,此种跳转只需修改指令指针,不需修改堆栈指针。
线程内跳转
跳转函数:
#include <setjmp.h>int setjmp(jmp_buf env); // 第一次返回0,调用longjmp跳转至此处时返回longjmp所设置的参数
void longjmp(jmp_buf env, int res); // 跳转至setjmp处进行非局部跳转时,需修改指令指针和堆栈指针,指令指针用于重新定位程序执行位置,堆栈指针用于恢复执行环境。有一个问题?在longjmp之后,函数栈是否会完全恢复到第一次调用setjmp时的样子(亦即,栈内的局部变量是否会回滚)。标准并未对此作答,但我们却可以用volatile关键字来保证局部变量不回滚;那如果我们就想回滚怎么办?没办法!示例程序:#include <unistd.h>#include <setjmp.h>#include <stdio.h>#include <stdlib.h>#include <string.h>static jmp_buf jmpbuffer;void jumpByCondition(char* str);int main(int argc, char *argv[]){ const int s_maxBuffer = 256; char buff[s_maxBuffer]; int val = 0; register int regVal = 0; volatile int volVal = 0; if (setjmp(jmpbuffer) != 0) { printf("error val=%d, regVal=%d, volVal=%d\n", val, regVal, volVal); exit(1); } while (fgets(buff, s_maxBuffer, stdin)) { ++val; ++regVal; ++volVal; jumpByCondition(buff); } exit(0);}void jumpByCondition(char* str){ if (strstr(str, "jump") != NULL ) { longjmp(jmpbuffer, 1); } else { int len = strlen(str); if (len - 1 > 0 && str[len - 1] == '\n') str[len - 1] = '\0'; puts(str); }}
进程资源
函数:#include <sys/resource.h>int getrlimit(int resource, struct rlimit *pLimit); // 成功返回0,出错返回非0int setrlimit(int resource, const struct rlimt *pLimit); // 成功返回0,出错返回非0struct rmlit{int rlim_cur; // 软限制(当前限制)int rlim_max; // 硬限制(最大限制)};进程资源常值意义RLIMIT_AS进程可用存储区的最大长度RLIMIT_CORE
core文件的最大字节数,若为0则表示阻止创建core文件
RLIMIT_CPUCPU时间的最大量值(单位秒),若超过此限制则向进程发送SIGXCPU信号RLIMIT_DATA初始化数据段、BSS段、堆的总长度限制RLIMIT_FSIZE可创建的文件的最大长度,超过此长度时向进程发送SIGXFSZ信号RLIMIT_LOCKS一个进程可持有文件锁的最大数量RLIMIT_MEMLOCK进程使用mlock可锁定的最大字节长度RLIMIT_NOFILE进程能打开的最大文件数RLIMIT_NPPROC每个用户ID可拥有的最大子进程数RLIMIT_RSS最大驻内存集的字节长度RLIMIT_SBSIZE用户在任一给定时间内可以占用的套接字缓冲区的最大长度RLIMIT_STACK栈的字节长度RLIMIT_VMEMRLIMIT_AS的同意词打印进程资源限制#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/resource.h>#define PRINT_RLIMIT(res) printrlimit(#res, res)void printrlimit(const char* name, int resID);int main(int argc, char *argv[]){ PRINT_RLIMIT(RLIMIT_AS); PRINT_RLIMIT(RLIMIT_CORE); PRINT_RLIMIT(RLIMIT_CPU); PRINT_RLIMIT(RLIMIT_DATA); PRINT_RLIMIT(RLIMIT_FSIZE); PRINT_RLIMIT(RLIMIT_LOCKS); PRINT_RLIMIT(RLIMIT_MEMLOCK); PRINT_RLIMIT(RLIMIT_NOFILE); #ifdef RLIMIT_NPPROC PRINT_RLIMIT(RLIMIT_NPPROC); #endif PRINT_RLIMIT(RLIMIT_RSS); #ifdef RLIMIT_SBSIZE PRINT_RLIMIT(RLIMIT_SBSIZE); #endif PRINT_RLIMIT(RLIMIT_STACK); #ifdef RLIMIT_VMEM PRINT_RLIMIT(RLIMIT_VMEM); #endif exit(0);}void printrlimit(const char* name, int resID){ struct rlimit limit; if (getrlimit(resID, &limit) != 0) { printf("getrlimit error. resid=%d\n", resID); exit(1); } printf("%14s curlim:", name); if (limit.rlim_cur == RLIM_INFINITY) { printf("(infinity)"); } else { printf("%10ld", limit.rlim_cur); } printf(" maxlim:"); if (limit.rlim_max == RLIM_INFINITY) { printf("(infinity)"); } else { printf("%10ld", limit.rlim_max); } putchar('\n');}
0 0
- 进程概要
- windows进程内存分布概要
- 进程间通信IPC概要
- 守护进程代码过程概要
- 进程,线程,协程的概要
- 概要
- 概要
- 概要
- 概要
- linux进程之间的通信方式学习之概要
- Android Binder实现的进程间IPC过程概要
- 一个干净的Windows XP系统启动后运行的进程(概要)
- 中间件概要
- SAML概要
- JSP概要
- IPV6概要
- 中间件概要
- ICE概要
- 【记录】ListView的学习
- 中大型移动互联网公司技术架构选择
- SpringIOC——注入Bean配置
- CoreData的使用
- 一个“蝇量级” C 语言协程库
- 进程概要
- Java学习日记之字符串处理
- Error Tips
- php图像处理函数大全(缩放、剪裁、缩放、翻转、旋转、透明、锐化的实例)
- 小糖出品:面向对象三大特性之多态
- 一些自学的html/javascript代码(setTimeout, alert, 定格动画)
- (2)mysql优化之使用索引优化查询
- 利用第三方服务器做双内网透传实验
- TF-IDF及其算法