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], ) 来读取管道中的信息