提示:全文仅是我(初学者)的笔记,可能有较多错误,请辩证观看,有错误请帮忙指出,谢谢。
1、进程创建:
- pid_t fork(void);
创建进程特性:
- 创建新的新的进程,失败时返回1;
- 成功时,父进程返回子进程的进程号,子进程返回自己的进程号;
- 通过fork的返回值区分是父进程还是子进程;
- 进程创建代码:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
pid_t pid;
pid = fork();
if (pid < 0){
perror("fork");
return -1;
}else if (pid == 0){
printf("chlid process: my pid is %d\n", getpid());
}else {
printf("parent process: my pid is %d\n", getpid());
}
return 0;
}
父子进程与子进程的关系特性:
- 子进程继承了父进程的内容;
- 父、子进程有独立的地址空间,互不影响;
- 若是父进程先结束,子进程成为孤儿进程,被init进程收养,子进程变为后台进程;
- 若是子进程先结束,父进程如果没有及时回收,子进程变为僵尸进程。
产生进程函数可以循环调用
- 第一次循环父进程产生一个子进程,第二次循环,父进程又产生一个新的子进程,子进程产生孙进程,此时总共共有四个进程。依次产生,每个子进程在下一轮中也能产生下一代进程。
2、进程关闭
void exit(int status);
void _exit(int status);
结束当前的进程,并将status返回,
exit结束进程时会刷新缓流区,exit在程序执行后在再刷新,而_exit()不给程序执行的时间。
3、进程的回收
进程回收
- 子进程由父进程回收;
- 孤儿进程由init进程回收;
- 若没有及时回收,会出现僵尸进程。
进程回收–wait
- #include <unistd.h>
- pid_t wait(int *status)
- 成功回收时,返回子进程的进程号,失败时返回EOF;
- 若子进程一直没有结束,父进程一直阻塞
- 有多个子进程,哪个先结束,就先回收哪个
- status指定保存子进程返回值和结束方式的地址
- status为NULL,表示直接释放子进程PCB,不接受返回值。
printf("child process: my pid is %d\n", getpid());
wait(&status);
printf("this process is dead, ret = %d\n", status);
进程回收–waitpid
- #include <unistd.h>
- pid_t waitpid(pid_t pid, int *status, int option)(pid=-1时表示任意的子进程);
- 成功时返回回收的子进程的pid或者0,失败时返回EOF
- pid可用于指定回收哪个子进程或者任意子进程
- status指定用于保存子进程的返回值和结束方式的地址
- option指定回收方式,0或者WNOHANG (0表示子进程没有结束时,父进程一直阻塞,WNOHANG在没有要回收时父进程直接跳出)
printf("child process: my pid is %d\n", getpid());
wait(pid, &status, 0);
printf("this process is dead, ret = %d\n", status);
~~未完