linux的父进程和子进程区分,linux下的父进程和子进程

首先理解几个概念
1.程序:就是我们日常所写的代码。
2.进程:程序在计算机中运行的实体。程序被加载到计算机内存中运行,即进行中的程序。不同进程间有用独立的内存
3.线程:程序执行流的最小单位,系统调度和分派的基本单位。一个进程至少拥有一个线程。一个进程中不同的线程可以共享内存资源,所以不同线程之间切换的消耗比进程小
IPC通信的几种方式:
1.管道:通常指无名管道,它是半双工的,同一个时间只能一头读,一头写。而且他只能用于具有血缘关系的进程间通信(父进程与子进程)
2.FIFO:命名管道
3.消息队列:消息的链接表
4.信号量:它是一个计数器。信号量用于实现进程间互斥与同步。
5.共享内存:顾名思义,指多个进程间共享一块给定的存储区。
以上五中通信方式的总结。
1.管道:速度慢,容量有限,而且只能用于父子进程之间通讯
2.命名管道:任意进程之间都可以使用,但是速度慢。
3.消息队列:容量受到系统限制,且第一次读的时候,要考虑上一次没有读完的数据的问题
4.信息量:不能用来传递复杂数据,只能用来同步
5.共享内存:能够很容易的控制容量,速度快。但是要保持同步,要注意锁的问题。防止一个进程在读的时候,另一个进程在写,造成错误。
在Linux下,父进程创建子进程需要用到fork()函数
一个进程通过fork()函数,创建一个和自己一样的进程。创建出来的进程子进程,而创建子进程的进程就是父进程
子进程是父进程的一个副本,是它的复制,两者不共享地址空间。
fork()函数最主要的特点是,调用一次,返回两次。
1.当父进程fork()创建子进程失败时,fork()返回-1。
2.当父进程fork()创建子进程成功时,此时,父进程会返回子进程的pid,而子进程返回的是0。所以可以通过返回的pid来控制父子进程后续所要执行的操作。
linux的父进程和子进程区分,linux下的父进程和子进程
文章图片

image.png
利用管道让父子进程间进行通信的操作。需要用到:
include
int pipe(int fd[2]); //若成功返回0,失败返回-1
当一个管道创建时,会创建两个文件描述符,fd[0]为数据进入打开,fd[1]为数据写出打开
1.首先利用pipe(fd)创建管道,判定函数的返回值,如果<0则表示创建失败
2.随后创建子进程,并判定fork()的返回值,fork()==0即表示子进程。
3.在子进程的代码块中,fd[0]打开,fd[1]关闭
4.在父进程的代码块中,fd[0]关闭,fd[1]打开。
以上即可实现,数据从父进程流入子进程的操作。
在Linux中,pid指的是运行在内存中的进程的id,而ppid则指的是它父进程的id。
【linux的父进程和子进程区分,linux下的父进程和子进程】有时候父子进程之间会出现,父进程运行结束了,在内存中销毁了。而子进程还没运行结束,此时,linux会把子进程挂在linux中的init进程下,这是Linux启动时开启的一个进程,是Linux所有进程的祖宗,pid为1。

    推荐阅读