linux的进程和线程
进程
进程,大白话来说其实就是正在运行的程序。
每个进程有自己的id号,别叫进程的标识号(PID),同时还有父进程id号(PPID)。
这里有一些关于进程的命令
进程的建立
fork()
建立了子进程,而父进程依旧在运行,直到结束。这个函数会返回两个值,如果进程是在父进程,fork的返回值是子进程的PID,而在子进程之中返回值是0,返回了负值说明创建失败。子进程会继承父进程的内存信息啥的。
vfork()
也会创建一个子进程,但是父进程不会继续 执行了,直到子进程调用了exec或exit函数之后,才能继续,子进程return不能使父进程继续。
进程的终止
第一种:
自己自然结束,return啥的。
第二种:
exit函数和_exit函数
exit(结束时返回的数值)
_exit(结束时返回的数值)
都是终止的函数
第一个会把缓冲区的内容写回文件,而第二个不会
wait(status)
随机等待任意一个子进程结束,然后继续进行下面的内容,staus有下面这些
waitpid(进程的pid,status,options参数)
options可以网上看看,我们大多数都是WHOHANG
exec族
exec函数族的作用是运行第一个参数指定的可执行程序。与fork不同,会终止原来进程,fork不会。以后再补充exec函数族。
system(“要执行的linux指令”)
就是执行linux的指令。
孤儿,僵尸和守护进程
孤儿进程,就是没有父进程的的子进程,父进程比子进程先退出了。
僵尸进程,就是没有父进程的的子进程,而子进程进入死循环无法退出,一直在运行。
守护进程,就是即使退出了终端,也在运行。
线程
线程,通常被叫做轻量级的进程,在进程之下,使用进程的空间内存。线程其实是执行一个已经定义好了的函数。
linux下线程编译
gcc -o 文件名 文件名.c -lpthreade
线程的创建
pthread_create(保存线程的地方,保存线程属性的结构指针,函数的指针,传给函数的值)
结构指针可以没有,输入NULL,而函数的指针,这个函数是 void* func(void *arg)这样的格式。
pthread_exit(要传输的值)
用来取消线程
线程的等待
pthread_join(线程的id,用来接收要等待线程返回值的地方);
等待一个线程的结束,并结束他的返回值。
线程的互斥锁
线程有三种锁,快速锁,嵌套锁,检错锁 。
锁用来控制公用资源的访问,实现对公共资源的独占,不让出错,一个个来访问资源。