1. 进程创建
-
进程创建:
pid_t fork(void)
– 通过复制父进程创建一个子进程,代码共享,数据独有。 -
fork的返回值:父进程返回值大于0,子进程返回0,出错返回-1。
-
写时拷贝技术:创建子进程后,子进程复制了父进程,因此父子进程一开始映射的是同一块物理内存,但是当内存数据要发生改变的时候,则重新为子进程开辟空间,拷贝数据过去。创建子进程效率高。
-
pid_t vfork(void)
– 创建一个子进程并阻塞父进程。父子进程共用虚拟地址空间。
· 父子进程共用栈区,如果同时运行就会造成栈混乱,因此vfork阻塞父进程,让子进程先运行,直到子进程exit退出或者程序替换后,父进程运行。
2. 进程退出
- main函数return;只是退出函数。
- 库函数:
void exit(int status);
可以在任意位置调用退出进程,退出前刷新缓冲区。 - 系统调用接口:
void _exit(int status);
可以任意位置调用退出进程,但是是直接释放资源,不刷新缓冲区。
-
退出场景
· 正常退出:通过以上三种方式退出
· 异常退出:程序因为某种错误中间崩溃退出 -
查看上一次系统调用使用错误的原因:
·perror -- void perror(const char *s);
·strerror -- char *strerror(int errnum)
– 执行下面程序后:从133行开始出现错误信息,之后都是未知错误。