linux读书笔记2013-1-25

来源:互联网 发布:java去除html代码 编辑:程序博客网 时间:2024/05/03 17:10
gcc 编译流程:
1、将C语言源程序预处理,生成.i文件
2、将预处理后的.i文件编译成汇编语言,生成.s文件
3、将汇编语言汇编后生成.o目标文件
4、将目标文件链接起来,生成可执行文件

gcc 常用编译选项:
-c  编译、汇编指定的源文件,但不进行连接
-S  编译指定的源文件,但不进行汇编
-E  预处理指定的源文件,但不进行编译
-o  将文件编译成可执行文件
-I   directory  指定include的头文件的搜索目录
-g  生成调试信息,该程序可以被调试器调试

fork 函数创建新进程,内核将父进程进程空间的内容复制到子进程空间。包括父进程的数据段和堆栈段,并且和父进程共享代码段。

fork 函数出错的情况:
1、系统中已经有太多的进程存在了
2、调用fork函数的用户的进程太多了

僵尸进程的概念
当自进程退出时,进程的退出信息仍然保持在内核,子进程的ID也同时保存在内核的进程列表中。僵尸进程几乎放弃所有的系统资源,包括进程地址空间等,僵尸进程不能被系统调度,也不会占用CPU时间。
如何产生僵尸进程
当父进程创建子进程后,子进程的退出信息没有被父进程回收,子进程就变成了一个僵尸进程。
避免僵尸进程的产生
1、在父进程中调用wait函数
2、当父进程在子进程之前结束运行,子进程就变成孤儿进程。linux中由init进程回收孤儿进程。作为一个系统的守护进程,init被设计为永远调用wait。

信号产生
1、用户按下某些终端按键,终端驱动程序会发送信号给前台进程。
2、硬件产生异常信号,这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当信号。
3、一个进程调用kill(2)函数可以发送信号给另一个进程。
4、可以用kill(1)命令发送信号給某个进程。
5、当内核检测到某种软件条件发生时,也可以通过信号通知进程。

处理信号
linux环境下的进程有三种处理方式:
1、忽略信号。
2、注册一个人信号处理函数,并要求内核在接收到信号时切换到用户态调用该处理函数,这种方式为捕获一个信号。
3、执行系统默认动作。系统使用的默认动作只有两种。终结进程或忽略信号。

函数的可重入,符合以下条件的函数是不可重入的。
1、使用了全局数据,全局变量或者静态变量。
2、调用动态方法得到内存,因为动态分配内存的方法也是以链表来管理内存分配的,这种数据也是全局作用域的。
3、使用了标准I/O库,标准I/O库很多都是以不可重入的方式使用全局数据结构。
原创粉丝点击