进线程(类型、状态、孤儿,僵尸进程)
一、进程
程序:程序是静态的,它是一些保存在磁盘上的指令的有序集合
进程:进程是动态的,是一个程序一次执行的过程,包括进程的创建、调度和消亡
正文段
数据段
系统数据段:pcb:进程控制块,通过进程控制块进行进程调度
pc:程序计数器,记录下一次的执行指令
CPU的所有寄存器值、数据堆栈
文件描述符表
进程的类型
交互进程:该类进程是由shell控制和运行的。交互进程既可以在前台运行,也可以在后台运行
前台进程:既可以从终端获取数据,又可以向终端输出
后台进程:./a.out &不能从终端获取数据,只能向终端输出,输出不影响终端使用
批处理进程:该类进程不属于某个终端,它被提交到一个队列中以便顺序执行
守护进程:该类进程在后台运行。它一般在Linux启动时开始执行,系统关闭时才结束
进程的运行状态
运行态(R):此时进程或者正在运行,或者准备运行
等待态:此时进程在等待一个事件的发生或某种系统资源。
可中断等待态(S)
不可中断等待态(D)
停止态(T):此时进程被暂停
死亡态(X):这是一个已终止的进程,但还在进程向量数组中占有一个task_struct结构
僵尸态(Z):进程结束时向父进程返回一个结果,如果父进程没有接收则进程处于
ps 查看系统中的进程
top 动态显示系统中的进程
nice 按用户指定的优先级运行进程
nice -n 10 ./a.out
renice 改变正在运行进程的优先级
renice 10 -n 8811
kill 向进程发信号
bg 将挂起的进程在后台执行
fg 把后台运行的进程放到前台运行
jobs 查看任务
fork
函数原型:
pid_t fork(void);
返回值:
0:子进程
子进程PID(大于0的整数):父进程
-1:出错
孤儿进程:父进程结束时子进程还未结束,子进程成为孤儿进程,由孤儿院收养,init 进程是孤儿院院长,此后子进程退出将状态告诉给孤儿院
*
僵尸进程:子进程结束向父进程传递数据,父进程还未接收时子进程处于僵尸进程状 态,当父进程接收数据后子进程才会完全死去进入死亡态
exit
函数原型:
void exit(int status);
函数参数:
status是一个整型的参数,可以利用这个参数传递进程结束时的状态。
_exit
函数原型:
void _exit(int status);
函数参数:
status是一个整型的参数,可以利用这个参数传递进程结束时的状态。
wait
函数原型:
pid_t wait(int *wstatus);
函数参数:
wstatus:子进程结束的状态,若为空,表示忽略子进程退出时的状态
返回值:成功返回子进程PID,失败返回-1
waitpid
函数原型:
pid_t waitpid(pid_t pid, int *status, int options);
函数参数:
pid:
pid>0:只等待进程ID等于pid的子进程,不管已经有其他子进程运行结束退
出了,只要指定的子进程还没有结束,waitpid就会一直等下去
pid=-1:等待任何一个子进程退出,此时和wait作用一样
pid=0:等待其组ID等于调用进程的组ID的任一子进程
pid<-1:等待其组ID等于pid的绝对值的任一子进程
status:子进程结束的状态
options:
WNOHANG:非阻塞等待
0:阻塞等待
返回值:结束的子进程的进程号,使用选项WNOHANG且没有子进程结束时:0,失败-1
exec函数族
exec函数族提供了一种在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了。
l:将另一个程序需要的参数一一列出
v:将另一个程序需要的参数写入一个数组放入函数
p:使用系统环境变量查找另一个程序
e:使用自定义环境变量提供另一个程序使用
/执行a.out程序,"abcd"作为a.out的命令行参数使用
execl("./a.out","a.out","abcd",NULL);
execl("/usr/bin/ls","ls","-l","-a",NULL);
char *buf[] = {"ls","-l","-a",NULL};
execv("/usr/bin/ls",buf);
execvp("ls",buf);
char *env[] = {"a=200","b=300",NULL};
execle("./a.out","a.out","12345",NULL,env);
a.out:
getenv("a");//200
getenv("b");//300
守护进程
1.创建子进程,父进程退出 fork
2.在子进程中创建新会话 setsid()
3.改变当前目录为根目录 chdir(“/”)
4.重设文件权限掩码 umask(0)
5.关闭文件描述符 getdtablesize()
原文地址:https://blog.csdn.net/musir1/article/details/145190633
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!