`

unix环境高级编程-第七章-进程环境

 
阅读更多

这两天都没写博客,主要是我想改变一下方法吧。不想一节节的读了,我想把一个整章看好了,然后进行思考,然后再进行编辑写在博客里。我觉得这样可以省的时间来思考,写程序。把每章中最主要的部门拿出来。算是第二遍复习。可以加深我的印象吧。

1进程终止

进程正常终止:

  1. #include<stdlib.h>
  2. void exit(int status);
  3. void _Exit(int status);
  4. #include<unistd.h>
  5. void _exit(int status);


区别:_exit和_Exit函数调用的时候立即进入内核,而exit函数则要进行一些清理操作。在进入内核。

如图所示:

exit()函数与_exit()函数最大的区别就在于exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是图中的“清理I/O缓冲”一项。
在Linux 的标准函数库中,有一套称作“高级I/O”的函数,我们熟知的printf()、fopen()、fread()、fwrite()都在此列,它们也被称作“缓冲I/O(buffered I/O)”,其特征是对应每一个打开的文件,在内存中都有一片缓冲区,每次读文件时,会多读出若干条记录,这样下次读文件时就可以直接从内存的缓冲区中读取,每次写文件的时候,也仅仅是写入内存中的缓冲区,等满足了一定的条件(达到一定数量,或遇到特定字符,如换行符\n和文件结束符EOF),再将缓冲区中的内容一次性写入文件,这样就大大增加了文件读写的速度,但也为我们编程带来了一点点麻烦。如果有一些数据,我们认为已经写入了文件,实际上因为没有满足特定的条件,它们还只是保存在缓冲区内,这时我们用_exit()函数直接将进程关闭,缓冲区中的数据就会丢失,反之,如果想保证数据的完整性,就一定要使用exit()函数。

看下面的例子

  1. /* exit2.c */
  2. #include<stdlib.h>
  3. main()
  4. {
  5. printf("output begin\n");
  6. printf("content in buffer");
  7. exit(0);
  8. }

编译并运行:

$gcc exit2.c -o exit2
$./exit2output begin
content in buffer

  1. /* _exit1.c */
  2. #include<unistd.h>
  3. main()
  4. {
  5. printf("output begin\n");
  6. printf("content in buffer");
  7. _exit(0);
  8. } <p>编译并运行:</p><p>$gcc _exit1.c -o _exit1
  9. $./_exit1
  10. output begin</p>

2.c程序的启动与终止

注意内核使程序执行的唯一方法是调用一个exec函数。进程自愿终止的唯一方法就是显示的或者饮食的调用exit ,_exit ,_Exit函数。

3.c程序在linux中

每个程序在系统中,都会有一个环境表。

当我们运行一个程序的时候,c程序有以下部分组成。

  • 正文段,这是由CPU执行的机器指令部分。通常,正文段是可共享的所以即使是频繁的执行的程序,在存储忠也只需要一个副本,另外,正文段常常是只读的。以防止由于意外而修改自身的指令。
  • 初始化数据段。它包含了程序中需要明确的赋初值的变量。如任何函数之外声明的 int maxcount=99;使此变量带有初值存放在初始化数据段中。
  • 非初始化数据段。通常称为bss段。在程序开始执行前,内核将此段忠的数据初始化为0或者空指针。出现在任何函数外的C声明。long sum[100];使此变量存放在非初始化数据段中。
  • 栈,自动变量以及每次函数调用时候所需要保存的信息都存放此段中。每次调用函数时候,其返回地址以及调用者的环境信息都存放再栈中。然后最近被调用的函数在栈上为其自动和临时变量分配的存储空间。通过以这种方式使用栈,可以递归调用C函数。函数每次调用自身的时候,就使用一个新的栈帧。因此一个函数调用示例忠的变量及不会影响另个一个函数调用的实例变量。
  • 堆。通常在堆中进行动态存储分配。对位于非初始化数据段和栈之间。

4.共享库

共享库使得可执行文件中不再需要包含公用的库例程。而只需要在所有进程都可引用的存储区忠维护这种库例程的一个副本。程序在第一次执行或者第一次调用某个库函数 的时候,用动态链接的方法见程序与共享库函数相链接。

当我们使用

命令查看的时候,就可以看到。

5.存储器分配

三个函数的声明分别是:

  1. void* realloc(void* ptr, unsigned newsize);
  2. void* malloc(unsigned size);
  3. void* calloc(size_t nelem, size_t elsize);


都在stdlib.h函数库内

原型:extern void *realloc(void *mem_address, unsigned int newsize);

用法:#include <alloc.h>
功能:改变mem_address所指内存区域的大小为newsize长度。

说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。

原型:extern void *malloc(unsigned int num_bytes);
用法:#include <alloc.h>

功能:分配长度为num_bytes字节的内存块

说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。

原型:extern void *calloc(int num_elems, int elem_size);
用法:#include <alloc.h>
功能:为具有num_elems个长度为elem_size元素的数组分配内存
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。

区别:

1、calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据

2、realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度

更多内容,欢迎访问:http://blog.csdn.net/wallwind

分享到:
评论

相关推荐

    UNIX环境高级编程

    第7章 UNIX进程的环境 122 7.1 引言 122 7.2 main 函数 122 7.3 进程终止 122 7.3.1 exit和_exit函数 122 7.3.2 atexit函数 124 7.4 命令行参数 125 7.5 环境表 126 7.6 C程序的存储空间布局 126 7.7 共享库 127 7.8...

    UNIX环境高级编程第二版

    第7章 UNIX进程的环境 122 7.1 引言 122 7.2 main 函数 122 7.3 进程终止 122 7.3.1 exit和_exit函数 122 7.3.2 atexit函数 124 7.4 命令行参数 125 7.5 环境表 126 7.6 C程序的存储空间布局 126 7.7 共享库 127 7.8...

    unix环境高级编程.rar

    第7章 UNIX进程的环境 122 第8章 进程控制 141 第9章 进程关系 180 第10章 信号 198 第11章 终端I/O 246 第12章 高级I/O 273 第13章 精灵进程 312 第14章 进程间通信 320 第15章 高级进程间通信 355 第16章 数据库...

    unix环境高级编程

    第七章〓Unix进程的环境 第八章〓进程控制 第九章〓进程关系 第十章:信号 第11章 终端I/O 第十二章 高级I/O 第十三章 精灵进程 第十四章 进程间通信 第十五章 高级进程间通信 第十六章 一个数据库函数库 第十七章 ...

    UNIX环境高级编程(第2版)书和源码

    第7章 进程环境 147 第8章 进程控制 171 第9章 进程关系 213 第10章 信号 233 第11章 线程 287 第12章 线程控制 313 第13章 守护进程 341 第14章 高级I/O 355 第15章 进程间通信 397 第...

    UNIX环境高级编程.pdf

    第7章 UNIX进程的环境 122 7.1 引言 122 7.2 main 函数 122 7.3 进程终止 122 7.3.1 exit和_exit函数 122 7.3.2 atexit函数 124 7.4 命令行参数 125 7.5 环境表 126 7.6 C程序的存储空间布局 126 7.7 共享库 127 7.8...

    unix环境高级编程13章

    3. 进程-Unix进程的环境(第七章)、进程控制(第八章)、进程之间的关系(第九章 )以及信号(第十章)。 4. 终端I/O(第十一章)、高级I/O(第十二章)以及精灵进程(第十三章) 5. IPC--进程间通信(第十四、...

    UNIX环境高级编程(中文版+英文版+源代码)

    第7章 UNIX进程的环境 122 7.1 引言 122 7.2 main 函数 122 7.3 进程终止 122 7.3.1 exit和_exit函数 122 7.3.2 atexit函数 124 7.4 命令行参数 125 7.5 环境表 126 7.6 C程序的存储空间布局 126 7.7 共享库 127 7.8...

    UNIX环境高级编程_第2版.part2

    第7章进程环境147 7.1 引言147 7.2 main函数147 7.3 进程终止147 7.4 命令行参数151 7.5 环境表152 7.6 c程序的存储空间布局152 7.7 共享库154 7.8 存储器分配154 7.9 环境变量157 7.10 setjmp和longjmp...

    UNIX环境高级编程_第二版中文

    第7章 进程环境  7.1 引言  7.2 main函数  7.3 进程终止  7.4 命令行参数  7.5 环境表  7.6 C程序的存储空间布局  7.7 共享库  7.8 存储器分配  7.9 环境变量  7.10 setjmp和longjmp函数  ...

    UNIX环境高级编程中文版

    第7章 UNIX进程的环境 122 7.1 引言 122 7.2 main 函数 122 7.3 进程终止 122 7.3.1 exit和_exit函数 122 7.3.2 atexit函数 124 7.4 命令行参数 125 7.5 环境表 126 7.6 C程序的存储空间布局 126 7.7 共享库 127 7.8...

    Unix环境高级编程电子书

    第7章 UNIX进程的环境 122 7.1 引言 122 7.2 main 函数 122 7.3 进程终止 122 7.3.1 exit和_exit函数 122 7.3.2 atexit函数 124 7.4 命令行参数 125 7.5 环境表 126 7.6 C程序的存储空间布局 126 7.7 共享库 127 7.8...

    UNIX环境高级编程(PDF)

    第7章 UNIX进程的环境 122 7.1 引言 122 7.2 main 函数 122 7.3 进程终止 122 7.3.1 exit和_exit函数 122 7.3.2 atexit函数 124 7.4 命令行参数 125 7.5 环境表 126 7.6 C程序的存储空间布局 126 7.7 共享库 127 7.8...

    UNIX环境高级编程 不扣分哦

    第7章 UNIX进程的环境 122 7.1 引言 122 7.2 main 函数 122 7.3 进程终止 122 7.3.1 exit和_exit函数 122 7.3.2 atexit函数 124 7.4 命令行参数 125 7.5 环境表 126 7.6 C程序的存储空间布局 126 7.7 共享库 127 7.8...

    UNIX环境高级编程(第二版中文)

    第7章 进程环境 147 7.1 引言 147 7.2 main函数 147 7.3 进程终止 147 7.4 命令行参数 151 7.5 环境表 152 7.6 C程序的存储空间布局 152 7.7 共享库 154 7.8 存储器分配 154 7.9 环境变量 157 ...

Global site tag (gtag.js) - Google Analytics