C 中的管道 - 我必须使用 fork 吗?

Posted

技术标签:

【中文标题】C 中的管道 - 我必须使用 fork 吗?【英文标题】:Pipelines in C - Do I have to use fork? 【发布时间】:2014-11-04 05:15:31 【问题描述】:

假设我在 Linux 环境中只使用 C。

通常,如果你想使用 pipe() 函数,你会创建一个管道然后 fork 它,从而允许父级与子级通信,反之亦然。

但是如果不是父子关系呢?如果我有一个正在运行的旧进程,是否可以使用 pipe() 函数与其通信?这个进程不是我当前进程的父进程(或以任何方式与之相关),但我有它的 pid。我是否仅限于文件或套接字进行进程间通信?

有没有什么方法可以在不使用套接字的情况下指定一个 pid 并从中接收信息?

【问题讨论】:

你的问题太笼统了,你不解释这两个进程是干什么的!请编辑您的问题以改进它! 【参考方案1】:

关于你的问题

但是如果不是父子关系呢?如果我有一个旧流程 正在运行,是否可以使用 pipe() 与它进行通信 功能?

您将无法与不是由父进程创建的任何其他进程进行通信。从技术上讲,你不应该被允许。

您需要通过操作系统或使用其他 IPC 机制来实现此功能。

数据库被广泛使用正是因为这个主要原因。多个进程将能够读取数据并将数据写入单个数据库。具有多重更新保护。

【讨论】:

【参考方案2】:

或者使用fifo(7)-s,又名命名管道,或者使用unix(7)套接字;另请阅读Advanced Linux Programming 以获得更多可能性。另见intro(2) & syscalls(2)

您还可以使用一些共享内存和信号量,参见shm_overview(7) 和sem_overview(7),或者(由RADAR 评论)消息队列,参见mq_overview(7)。但是对于 IPC 使用signal(7)-s 通常是个坏主意。

请注意,inter-processor communication 通常需要两个流程的合作和修改;换句话说,您可能应该更改旧 A 和启动 B 进程的代码!而且您可能不希望进程 A 在未经同意的情况下泄露信息。

顺便说一句,您也可以使用mmap(2) 共享内存,例如在一个共同的文件上。但是你需要一些同步。

另请阅读proc(5);通过/proc/1234/可以查询进程1234的一些信息。

顺便说一句,虽然pipe(7)-s 确实经常在父进程和子进程之间调用fork(2) 之前设置(使用pipe(2)),但这不是强制性的。特别是,在某些情况下,您希望进程通过管道传输到自身(例如,Unix signal delivery in Qt)。

【讨论】:

以上是关于C 中的管道 - 我必须使用 fork 吗?的主要内容,如果未能解决你的问题,请参考以下文章

popen() 可以制作像 pipe() + fork() 这样的双向管道吗?

C 程序在“fork()”和管道中存在问题

命名管道,使用 Fork()

在 C 中使用管道运行并发进程

在 fork 后使用读/写管道 2 字符串

使用循环在 C 中管道两个或多个 shell 命令