system命令创建一个新的进程然后有这个新的进程然后再执行相关的命令,层数多鸡肋
缺点:system层数太多,往往用fork()
优点:可以进行跨语言调用,或者是脚本完成,可以用system
fork()函数父进程是返回子进程的fd,子进程是返回0。fork()创建的子进程完全复制父进程的(除了pidppid),但是在创建以后单独处理的部分就不一样了
创建进程是因为一个进程崩了不希望影响另一个,解耦。打开一个游戏,fork(),地图,音乐等单独分出去做相关功能,理解这个意思,因为游戏一般是耦合一个崩了就没法玩了不如全崩
fork进行立即的逻辑复制父进程,实际上物理写时复制,也就是因为很多的东西都是相同的,但是很多东西可能不会用到,所以说只有在需要用到的时候才会在物理上复制父进程的数据。
先fork再打开的文件不会共享读写位置,那么这个时候就是有两个文件描述符,其中存放读写指针,然后指向同一个inode节点
!!fork()在进行复制的时候是复制全部的信息,所以说如果没有能够清空缓冲区的时候就会导致将fork以前的内容也进行复制。
往往是fork()和exec()结合使用fork以后再用exec丢弃父进程的东西进行切换进程
fork()函数如果fork()两次的话是三个进程也可能是四个!
wait和witpid用来被父进程清理死掉的子进程的相关资源,是一个阻塞进程,只能收一个。
进程结束的分为主动结束和被动结束,return和exit和_exit(不收尸就走人),和ctrl+c,ctrl+/与kill发送信号原理相同abort一样(虽然主动调用但是信号被动实现)
pipe函数在父子进程之间本身不就是创建两个管道??????????
父进程一般都会给子进程收尸,前提时父进程退出,借助wait函数和waitpid收尸,他们是阻塞函数,但只能收一个,如果确定没有需要收的了就返回别的值。子进程的return是返回给给他收尸的父进程。当然waitpid也可以不阻塞监控对应的fd
进程组组id以第一个进程id作为组id,但是组长死了组id也不会变。
子进程和父进程是在同一个组,如果进行setpgid以后子进程自立门户,就有了两个组
建立一个会话有一个前台进程组(fork)和多个后台进程组,只有前台进程组可以接收键盘信号,这也就是为什么ctrl+c不能停止后台进程组。tip:后台进程组可以接收信号像是kill命令
fg后台放前台操作结束可以
进程组依赖于会话组,会话组死了,进程组就over
所以说需要把一直运行在云服务器的进程设置为守护进程放在云服务器上
框架:在进程中创建进程:
system执行命令,就是层数太多,往往用来执行脚本或者其他语言命令
fork真儿子,除了名字,其他内容和老爹没啥区别,可以根据名字对父子做不同的处理,也可以一家子一块做相同的事情。
exec别人家的儿子,就只要你老爹的名字pid不变,还代替你老爹的位置原父进程结束,其他的都不稀罕不要。
结束进程:
正常结束和异常结束
收拾东西:wait和waitpid函数
前后台进程&