C 语言演示 fork() 和 pipe() 的程序

2024年8月28日 | 阅读 4 分钟

在下面的教程中,我们将理解在 C 语言中 fork() 和 pipe() 的实现。

那么,让我们开始吧。

fork()

  • fork() 函数用于启动一个新进程。这个子进程是父进程的精确副本。在类 Unix 操作系统上,这是创建新进程的主要方法。
  • 通过 fork 系统函数会创建一个称为“子进程”的新进程,它与调用 fork() 的进程(父进程)同时运行。一旦新的子进程启动,两个进程都将执行 fork() 系统调用之后的下一条指令。子进程使用与父进程相同的 CPU 寄存器、程序计数器和打开的文件。
  • 它返回一个整数值,并且不需要任何参数。下面列出了 fork() 返回的不同值。

pipe()

  • 管道可以用于一个进程向其写入,另一个进程从中读取。这被称为单向通信。它首先打开一个管道,这是一块作为“虚拟文件”的主内存区域。
  • 生产进程及其所有后代都可以对管道进行读写。一个进程可以写入这个“虚拟文件”或管道,而另一个与之相连的进程可以从中读取。
  • 如果一个进程在没有任何内容写入管道之前尝试读取,该进程将被暂停,直到有内容写入为止。
  • pipe 系统调用会在进程的打开文件表中找到前两个可用的位置,分配给管道的读端和写端。

C 语言演示 fork() 和 pipe() 的程序

使用 C 程序创建两个进程 P1 和 P2。P1 接收一个字符串后将其传递给 P2。P2 在不使用字符串函数的情况下,将接收到的字符串与另一个字符串连接,并将结果返回给 P1 进行打印。

示例


说明

我们使用 fork() 来生成一个子进程。fork() 返回以下信息:< 0 表示创建子(新)进程失败,=0 表示子进程,>0(即子进程的进程ID)返回给父进程。当返回值 >0 时,父进程将运行。

信息可以使用 pipe() 函数从一个进程发送到另一个进程。由于 pipe() 是单向的,可以设置两个管道——每个方向一个——来实现进程间的双向通信。

在父进程内部: 我们首先关闭第一个管道的读端 (fd1[0]),然后通过管道的写端 (fd1[1]) 写入字符串。现在父进程将等待直到子进程完成。子进程结束后,父进程将关闭第二个管道的写端 (fd2[1]),并通过管道的读端 (fd2[0]) 读取字符串。

在子进程内部,子进程通过关闭管道的写端 (fd1[1]) 来读取父进程发送的第一个字符串,读取后连接两个字符串,然后通过 fd2 管道将字符串发送给父进程,然后退出。