Linux进程环境

一 main函数

当内核使用一个exec函数执行C程序时,在调用main函数之前先调用一个特殊的启动例程,可执行程序将此例程指定为程序的起始地址。启动例程从内核获取命令行参数和环境变量,然后为调用main函数做好准备。

二 进程终止
进程终止的方式有8种,前5种为正常终止,后三种为异常终止:
1 从main函数返回;
2 调用exit函数;
3 调用_exit或_Exit;
4 最后一个线程从启动例程返回;
5 最后一个线程调用pthread_exit;
6 调用abort函数;
7 接到一个信号并终止;
8 最后一个线程对取消请求做出响应。
(1)exit函数
#include <stdlib.h>
void exit( int status );
void _Exit( int status );
#include <unistd.h>
void _exit( int status );
这三个函数用于正常终止一个程序,_exit和_Exit立即进入内核,而exit则要先做一些清理工作(调用执行各终止处理程序,关闭所有标准I/O流),再进入内核。三个函数所带的整型参数称为终止状态或退出状态,如果(a)调用这些函数不带参数,(b)main函数中的return语句无返回值,(c)main函数没有声明返回类型为整型,则进程的终止状态是未定义的。main函数返回一个整型值与用该值调用exit是等价的。
(2)atexit函数
#include <stdlib.h>
int atexit( void (*fun)( void ) );
一个进程可以登记32个函数,这些函数由exit自动调用,这些函数被称为终止处理函数,atexit函数可以登记这些函数。exit调用终止处理函数的顺序和atexit登记的顺序相反,如果一个函数被多次登记,也会被多次调用。

三 环境表
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以NULL结尾的环境字符串,环境指针environ是一个全局变量,指向指针数组的地址。通常用getenv和putenv函数来访问特定的环境变量,而不是environ全局变量。如果要查看整个环境,则必须用environ全局变量。

四 C程序的存储空间布局
1 正文段
CUP执行的机器指令部分,是共享和只读的。
2 初始化数据段
又称作数据段,包含了程序中明确需要赋初值的变量。
3 非初始化数据段
在程序开始执行前,内核将此段中的数据初始化为0或空指针。
4 栈
自动变量以及每次函数调用时所需保存的数据都存放在此段中。
5 堆
用于动态存储分配。堆位于栈和非初始化数据段之间。

五 存储器分配
#include <stdlib.h>
void *malloc( size_t size );
void *calloc( size_t nobj, size_t size );
void *realloc( void *ptr, size_t newsize );
void free( void *ptr );
malloc函数分配指定字节数的存储区,该存储区中的初始值不确定;calloc函数为指定数量且指定长度的对象分配存储空间,该空间中的每一位都初始化为0;realloc函数更改存储区的长度(增加或减少),新增区域内的初始值不确定,如果ptr为空,realloc和malloc的功能相同。
以上函数的大多数实现所分配的存储空间都比所要求的大一些,额外的空间用来存储管理信息。如果在一个超过已分配区的尾端进行写操作,就会重写下一个分配区的管理记录;同样,在一个已分配区的起始位置之前写入,会重写本分配区的管理记录。这种错误是灾难性的,但因为不会很快暴露出来,所以很难发现。

六 环境变量
环境字符串的形式如:name=value,它们的解释完全取决于各个应用程序,而与内核无关。
#include <stdlib.h>
char *getenv( const char *name );
int putenv( char *str );
int setenv( const char *name, const char *value, int rewrite );
int unsetenv( const char *name );
getenv函数返回指向name=value中的value的指针;putenv函数把字符串name=value放入环境表中,如果name已经存在,则先删除原来的定义;setenv函数将name设置为value,如果name存在且rewrite非0,则删除其现有定义,若rewrite为0,则不删除其现有定义;unsetenv函数删除name的定义,即使不存在也不会出错。

七 setjmp和longjmp
#include <setjmp.h>
int setjmp( jmp_buf env );
void longjmp( jmp_buf env, int val );
setjmp和longjmp函数用于处理发生在深层次函数调用中的出错情况,longjmp函数可以在栈上跳过若干个调用帧,返回到当前函数调用路径上的某个函数中。在希望返回到的位置调用setjmp,数据类型jmp_buf是某种形式的数组,存放在调用longjmp时能用来恢复栈状态的所有信息。因为需要在另一函数中引用env变量,所以将env定义为全局变量。当检查到一个错误时,调用longjmp函数,第一个参数env就是在调用setjmp时所用的env,第二个参数val非0,它将成为从setjmp处返回的值。使用第二个参数的原因是一个setjmp可以对应多个longjmp,这样就可以根据返回值来判断造成返回的longjmp函数在那个函数中,从而确定出错的位置。

八 getrlimit和setrlimit函数
#include <sys/resource.h>
int getrlimit( int resource, struct rlimit *rlptr );
int setrlimit( int resource, const struct rlimit *rlptr );
getrlimit和setrlimit函数用于获取或设置进程的资源限制。资源限制通常是由进程0建立的,由每个后续进程继承。更改资源限制时,注意以下三条规则:
1 进程的软限制值只能小于或等于硬限制值;
2 任意进程都可以降低其硬限制值,但它必须大于或等于其软限制值,这种操作对普通用户是不可逆的;
3 只有超级用户进程可以提高硬限制值。
资源限制影响到调用进程并由其子进程继承,这意味着为了影响一个用户的所有进程,需要将资源限制构造在shell中。

转载于:https://www.cnblogs.com/mahy/archive/2012/01/04/2310988.html

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

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

相关文章

JO、JNO、JB、JNB命令详解(从原理上)

JO 当执行到jo命令时&#xff0c;如果ZF标志位为1&#xff0c;则跳转&#xff0c;反之不跳转 add eax,ecx jo 00401000c此时eax7fff ffff &#xff0c;ecx0000 0001&#xff0c;执行完add命令&#xff0c;OF1&#xff0c;原因是eax存储的最大值是7fffffff&#xff0c;再加1&a…

java 根据类名示例化类_Java类类getProtectionDomain()方法及示例

java 根据类名示例化类类class getProtectionDomain()方法 (Class class getProtectionDomain() method) getProtectionDomain() method is available in java.lang package. getProtectionDomain()方法在java.lang包中可用。 getProtectionDomain() method is used to return …

snagit 9.0注册码

8.0的注册码 A5CCU-RYNM4-C9ECC-5CWW9-B5R7B 5HCC5-4CCC9-NGXCM-XYDZ5-H6ER6 HLHAD-2CZLC-8XYDC-CC5CB-P289A D5DSC-WZCBM-JRHSC-QVTEV-TR7R8 snagit 9.0: name:Team Z.W.T sn:XMYU5-9CMBC-5SLBZ-DKML2-JE8M5 谢谢 name:Team Z.W.T sn: WDYMP-8ALRM-GVVV2-PH8VK-6MD27 Z…

vue3 配置 @符号

config,ts 配置 有 爆红 安装 npm install 一下 然后 配置 路径提示功能 tsconfig.json 配置 路径提示功能 一共这两个路径配置

android 页面转换

通过setContentView来改变布局 很简单 ViewchangeActivity.java package idrc.change;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class ViewchangeActivity extends Activity {/** Called when the…

mts模式_MTS的完整形式是什么?

mts模式MTS&#xff1a;Microsoft Transaction Server /移动电话服务/多通道电视声音 (MTS: Microsoft Transaction Server/ Mobile Telephone Service/ Multichannel Television Sound) 1)MTS&#xff1a;Microsoft Transaction Server (1) MTS: Microsoft Transaction Server…

Java——IO流

一&#xff0c;IO流常识 Ⅰ&#xff0c;IO流的概述 1&#xff0c;IO流用来处理设备之间的数据传输 2&#xff0c;Java对数据的操作都是通过流的方式 3&#xff0c;Java用于操作流的类都在IO包中 4&#xff0c;流 按流向分为&#xff1a; ①输入流 ②输出流 5&#xff0…

JBE、JNBE、JA、JL指令详解(从原理上)

JBE 当执行到JBE命令时&#xff0c;如果此时的CF标志位或者ZF标志位为1&#xff0c;跳转&#xff0c;其他不跳转 相当于小于等于命令 cmp eax&#xff0c;ecx jbe 0040100c执行到cmp命令时&#xff0c;如果此时的eac小于等于ecx&#xff0c;jbe都会跳转到0040100c 因为小于的…

数组shift方法_数组shift()方法以及JavaScript中的示例

数组shift方法JavaScript shift()方法 (JavaScript shift() method) shift() method is used to remove the first element of an array and returns the deleted element. shift()方法用于删除数组的第一个元素&#xff0c;并返回删除的元素。 It changes the array length. …

ArcMap 9使用技巧

ArcMap 9使用技巧技巧1 重叠要素的选择切换目标&#xff1a;在覆盖同一区域的多个要素中切换被选择要素操作步骤&#xff1a;1&#xff0e;在编辑环境中选中覆盖同一区域的多个要素中的一个要素2&#xff0e;按下N 键&#xff0c;被选要素就会自动地切换到另一个图层的要素3&am…

《软件》2011年第6期刊登出 《DB 查询分析器》中断SQL语句的执行

《软件》编辑部寄来了2011年第6期样刊&#xff0c;在2011年第6期&#xff0c;刊登出了本人的论文------“《DB 查询分析器》中断SQL语句的执行”。 论文刊登在第42页&#xff0c;排在第13篇&#xff0c;还比较靠前&#xff0c;呵呵。 在“万方数据”和“中国期刊全文数据库”中…

Java——IO流(序列流)

序列化与反序列化 游戏存档&#xff1a;目的是为了游戏下次上号数据的保存 package com.yy.otherio;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; im…

ret2libc过地址随机化

程序&#xff1a; #include<stdio.h> char buf2[10] "this is buf2"; void vul() {char buf1[10];gets(buf1); } void main() {write(1,"sinxx",5);vul(); }很明显&#xff0c;gets函数存在溢出 编译&#xff1a; gcc -no-pie -fno-stack-protect…

[导入]Lucene并发访问

作者: yagesi 链接&#xff1a;http://yagesi.javaeye.com/blog/165604 发表时间: 2008年02月27日 声明&#xff1a;本文系JavaEye网站发布的原创博客文章&#xff0c;未经作者书面许可&#xff0c;严禁任何网站转载本文&#xff0c;否则必将追究法律责任&#xff01; 在Luce…

Python程序计算给定文本中单词的出现

Given a text (paragraph) and a word whose occurrence to be found in the text/paragraph, we have to find the how many times word is repeated in the text. 给定一个文本 (段落)&#xff0c;其出现在文本/段落被找到的单词 &#xff0c;我们必须找到如何词多次在文本重…

js私有共有成员

在小项目中对于JavaScript使用&#xff0c;只要写几个function就行了。但在大型项目中&#xff0c;尤其是在开发追求 良好的用户体验的网站中&#xff0c;如SNS,就会 用到大量的JavaScrpt&#xff0c;有时JavaScript的工作量胜过了C#&#xff0c;这时写一堆function,就会显得很…

Java——IO(打印流)

1&#xff0c;打印字节流(PrintStream)的概述&#xff1a; 打印流可以很方便的将对象的toString()结果输出并且自动加上换行&#xff0c;而且可以使用自动刷出的模式 System.out就是一个PrintStream&#xff0c;其默认向控制台输出信息 2&#xff0c;使用方式&#xff1a; …

MATLAB中的正态分布检验

要对一组样本进行正态性检验&#xff0c;在MATLAB中&#xff0c;一种方法是用normplot画出样本&#xff0c;如果都分布在一条直线上&#xff0c;则表明样本来自正态分布&#xff0c;否则是非正态分布。 MATLAB中也提供了几种更正式的检验方法&#xff1a;kstest Kolmogorov-Smi…

远控免杀专题(29)-C#加载shellcode免杀-5种方式(VT免杀率8-70)

0x00 免杀能力一览表 几点说明&#xff1a; 1、表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家…

kotlin 或 运算_Kotlin程序对两个数字执行算术运算

kotlin 或 运算Here, we are implementing a Kotlin program to perform various arithmetic operations on two numbers. 在这里&#xff0c;我们正在实现Kotlin程序&#xff0c;以对两个数字执行各种算术运算 。 Given two numbers a and b, we have to find addition, sub…