进程、信号

来源:互联网 发布:廖雪峰java 编辑:程序博客网 时间:2024/06/05 08:02
1.进程的状态:就绪、运行、阻塞(从操作系统划分)
2.阻塞:可中断的睡眠状态(可以由信号阻断)、不可中断的睡眠状态(不可以由信号阻断) 
3.什么时候产生僵死进程?
子进程先于父进程结束,父进程没有获取子进程的退出码。
4.init 进程 pid == 1
父进程结束后,子进程统一挂到init进程下,就不会产生僵死进程
5.(1)在系统中产生僵死进程
父进程的父进程是bash,用ppid可以知道,bash自己复制一份,用复制好的替换main程序
(2)在代码中处理僵死进程  wait()
6. WIFEXITED(start_val)  如果子进程正常结束,它就取一个非零值
WEXITSTATUS(start_val)  如果WIFEXITED非零,它返回子进程的退出码
7. 文件的操作
fopen  fread  fwrite  fclose   库函数
open  read   write  close   系统调用
int f = open();     与之对比的是:FILE *fp = fopen
f:文件描述符:整型
open打开一个文件,就会得到一个文件描述符,这个文件描述符>=0

2:标准错误输出    stderror.h
文件描述符会选下标最小未被使用的下标 

类比于FILE * 

-----------------------------------------------------------------------------------------------------------------------------------------------------------

1. 通过inode节点号访问文件,当这个节点没人用,就把它free掉
3那一项的指针指向struct file结构体,访问同一个文件,所以是同一个inode节点
2. (先打开后复制)在父进程中打开的文件经fork复制,在子进程中仍然可以访问,并和父进程共享文件偏移量
3. (先复制后打开)自己想想
4. 打开一个文件要及时把它关闭,然后就可以释放节点
5. 系统调用和库函数的区别
系统调用:实现在内核中,也就是编写操作系统时就实现了该方法   内核中
库函数:实现在库里面     用户的库文件中
用户态、:执行用户代码  自己写的,库方法   权限低
内核态:执行内核代码  内核中的方法        权限高
磁盘中的数据-》内存-》缓存-》寄存器
6. eax(寄存器)
7. 系统调用表
8. 中断 0x80号中断(系统调用)
9. 替换进程  或装载进程     ecec系列  
exec系列函数由一组相关的函数组成,它们在进程的启动方式和程序参数的表达方式上各有不同。Exec函数可以把当前进程替换为一个新进程,新进程由path或file参数指定。你可以使用exec函数将程序的执行从一个程序切换到另一个程序。例如,你可以在启动另一个有着受限制使用策略的程序前,检查用户的凭证。Evec函数比system函数更有效,因为在新的程序启动后,原来的程序就不再运行了。
execl   execlp    execle   execv    execvp    execve   
前面5个调用最后一个
10. 一个新进程的产生:forc+exec
11. echo  $PATH   得到环境变量
带p的有环境变量这个参数
execl 默认传递环境变量,所以自己改不了;execlp:自己可以写环境变量
execv:将参数放在数组里
execvp:主要执行系统命令
execve:系统调用
以上5个封装了最后一个
12. 信号(windows上叫事件)作用:通知进程产生了某种事件。 
13. 程序可用signal库函数来处理信号
signal:改变信号的响应方式:默认、忽略、自定义
signal实现相当复杂,它是一个带有sig和func两个参数的函数。准备捕获或忽略的信号由参数sig给出,接收到指定的信号后将要调用的函数由参数func给出。信号处理函数必须有一个int类型的参数(即接收到的信号代码)并且返回类型为void。signal函数本身也返回一个同类型的函数,即先前用来处理这个信号的函数,或者也可以用下面的两个特殊值之一来代替信号处理函数。
(1)SIG_IGN        忽略信号
(2)SIG_DFL        恢复默认行为
(3)自定义函数
比如一个信号:SIGINT   其含义是:终端中断
 
信号所在头文件:<signal.h> 
系统的kill发送的是哪个信号

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1、Kill:发送一个信号
2、SIGCHLD
子进程状态发生改变时,发送给父进程。(或者子进程结束了,会给父进程发送)
特点:进程对该信号的默认响应方式是忽略
3、Kill(pid_t pid,int sig);      kill:结束进程的命令
4、Signal(int sig,void (*pfun)(int));
5、如何查看僵死进程?
./main &
Ps
Ps

6、默认处理不会处理僵死进程,忽略可以解决僵死进程
7.解决僵死进程的两种方法:
(1)Wait(NULL);     (2)改为忽略模式
8、跟踪子进程:set  follow-fork-mode child
9、cd   exit:内置命令

原创粉丝点击