一、进程的创建与终止
1、进程创建 pid_t pid = fork();
进程具有进程编号类型为pid_t,接收创建进程的fork()函数返回的进程编号.
使用fork()函数创建的进程是与原本创建它的进程内容一致的,是其的一个副本,并在进程表中创建一个新的表项,新的表象中许多属性跟创建它的进程是相同的,新进程与原进程几乎一摸一样,执行代码也一样.
但是新进程具有自己独立的数据空间、环境与文件描述符.
创建子进程后:pid == 0 说明是子进程 pid<0进程创建失败
子进程返回值
2.exec系列函数
exec系列函数用于替换进程内容,将原本运行的进程内容替换为新的二进制内容执行
进程一般都会使用exec系列函数替换子进程中的内容来执行新的内容
3.父进程等待子进程函数; wait()
4、结束进程使用exit()
僵尸进程:
在子进程结束后,父进程尚未调用wait()函数之前的一段时期称子进程称作僵尸进程;僵尸进程只存在一个比较短暂的时间,当父进程调用wait()函数后,子进程数据空间、表项内容等将会释放.
孤儿进程:
如果父进程在子进程结束之前就结束了,子进程就称为孤儿进程.由于子进程占用一定的空间、表项,所以积累过多对系统性能产生影响,所有系统所有的进程的父进程init()会定期调用wait()来结束子进程.
init()进程是所有进程的父进程,如果其他子进程的父进程在结束其子进程之前结束,所有的孤儿进程将会由init()进程管理.
二、进程信号的发送与处理:
信号使系统为了响应某些条件而产生的一个事件,接收到该信号进程会产生一些行动;
信号是某些错误条件产生的,如内存段冲突、浮点处理、非法指令等,可以作为进程间传递消息或者修改行为的一种方式,明确的有一个进程发送给另一个进程。信号可以被生成、捕获、响应、忽略.
进程发送信号函数为kill(),将sig信号发送至pid所指的进程当中,成功发送时0
出错的可能性为:
1、进程不在
2、信号无效
3、没有权限
一般来说,相同的用户ID之间进程可以相互发送,超级用户可以给任何用户发送信号.
信号的处理函数:signal();
void (*signal(int sig,void (*func (int))(int);
signal函数具有两个参数,其返回值与第二个参数即信号处理函数返回值一样都为void 类型,并且其参数都是int类型.
关于alarm()函数,参数设定一个秒数,返回值是剩余的秒数,如果调用失败返回-1,alarm函数时间设定到达后会安排发送一个SIGALRM信号.