创建进程、子进程和进程间通信
fork() 方法
fork 原型:
pid_t fork(void)
fork的定义:
父进程在调用 fork 派生子进程,实际上相当于创建了一个进程拷贝
调用一次 fork() 会返回两次
- 一次:在调用该方法的进程中返回 子进程的 id
- 二次:在子进程中返回 0
- 若在调用该方法时返回 -1 则表示调用失败
根据 fork 的返回值判断当前进程是父进程还是子进程:
#include<stdio.h> #include<unistd.h> int main(){ pid_t pid = fork(); if(pid == 0){ printf("child\n"); } else{ printf("father\n"); } return 0; }
进程间通信 IPC
Inter-Process Communication
: 多个进程之间相互沟通的一种方法
管道、命名管道、消息队列、信号、信号量、共享内存、内存映射、套接字
管道 PIPE
- 管道:用于进程间通信 的一段共享内存
- 创建管道的进程:管道服务器
- 连接到的一个管道的进程:管道客户机
- 一个进程,在向管道写入数据后,另一个进程就可以从管道的另一端读取
管道的特点:
- 单向通信:数据只能向一个方向流动,
- 需要双方交流时,创建两个管道
- 只能用于具有亲缘关系的进程:
- fork 或者 exec
- 管道只能在本地计算机使用,不能用于网络间的通信
使用:
- 函数原型:
int pipe(int fd[2]);
- 返回0 成功,返回-1出错
- fa参数返回两个文件描述符:
- fd[0] 指向管道的读端
- fd[1]指向管道的写端
实现进程间通信的步骤:
- 父进程创建 管道,得到两个描述符,指向管道的两端
- 父进程 fork 子进程,子进程也有两个文件描述符指向同一个管道两端
- 一个进程关闭写端,另一个进程关闭读端,即可实现通信
- 使用
close()
关闭fd[]
- 使用
- 关闭读端的进程使用
write(fd[1], )
来写入管道信息 - 关闭写端的进程使用
read(fd[0], )
来读取管道中的信息
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment