进程
进程控制块: 进程标识PID、进程用户、进程状态、优先级、文件描述符
进程类型: 交互进程、批处理进程、守护进程
命令
PID
PRI 进程优先级
top 实时进程
nice 数值越大优先级越低
进程
创建子进程 : fork 失败时返回-1,成功时父进程返回子进程的进程号,子进程返回0
要点: 1.子进程只执行fork之后的代码。
2.父子进程执行顺序是操作系统决定的。
#include <stdio.h>
#include <unistd.h>
int mian(int argc,char **argv)
{
pid_t pid;
printf("before fork\n");
pid = fork();
if(pid>0){
printf("this is father process\n");
}else if(pid ==0){
printf("this is child process\n");
}else if(pid<0)
{
perror("fork");
return 0;
}
printf("pid=%d\n",(int)pid);
printf("after fork\n");
}
父子进程:
1.子进程继承了父进程的内容
2. 父子进程有独立的地址空间,互不影响
若父进程先结束:1.子进程成为孤儿进程,被init进程收养。2.子进程变成后台进程。
若子进程先结束 :父进程如果没有及时回收,子进程变成僵尸进程
#include <stdio.h>
#include <unistd.h>
int main( ){
pid_t pid;
int i;
for(i=0;i<5;i++){
pid = fork();
if(pid<0){
perror("fork");
return 0;
}else if(pid == 0){
printf("child process\n");
sleep(5);
//break; 直接退出不执行下面的代码
}else{
printf("father process\n");
sleep(5);
}
}
}
3.进程的结束:
进程的结束 exit/_exit (1).结束当前的进程并返回status。(2)exit结束进程时会刷新缓冲区.
return和exit的区别 : main函数结束时会隐式的调用exit函数,普通函数return是返回上一级
4.进程的回收 wait
pid_t wait 成功时返回回收的子进程的进程号;失败时返回EOF 若子进程没有结束,父进程一直阻塞 若有多个子进程,哪个先结束就先回收 status指定保存子进程返回值和结束方式的地址 status为NULL表示直接释放子进程PCB,不接收返回值。
waitpid :进程回收