2014-11-04 55 views
1

让我们假设我只在C环境下工作。C中的管道 - 我必须使用fork吗?

通常,如果你想使用管道()函数,你可以创建一个管道,然后叉它,从而使父母与孩子沟通,反之亦然。

但是,如果它不是父母和孩子呢?如果我有一个正在运行的旧进程,是否可以使用pipe()函数与它进行通信?这个过程并不是我当前过程的父亲(或任何相关的),但我有它的PID。我是否限于文件或套接字进行进程间通信?

有没有什么方法可以让我有可能指定PID和接收来自它的信息,而无需使用插座?

+0

使用消息队列 – radar 2014-11-04 05:20:49

+0

你的问题太广,你不解释一下这两个过程做!请*编辑您的问题*以改善它! – 2014-11-04 06:05:29

回答

1

或者使用fifo(7) -s,又名命名管道,或使用unix(7)插座;也读Advanced Linux Programming以获得更多的可能性。又见intro(2) & syscalls(2)

你也可以使用一些共享内存和信号灯,看到shm_overview(7) & sem_overview(7),或消息队列(如RADAR评论),见mq_overview(7)。但使用signal(7) -s用于IPC通常是一个坏主意。

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

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

又读proc(5);直通/proc/1234/您可以查询有关流程1234

BTW一些​​信息,而事实上pipe(7) -s呼吁父子进程并非是强制性之间fork(2)之前经常设置(使用pipe(2))。特别是,有些情况下您想要一个进程自行管理(例如,对于Unix signal delivery in Qt)。

1

您的问题

但是,如果这不是一个家长和孩子呢?如果我有一个正在运行的旧进程 ,是否可以使用管道() 函数与它进行通信?

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

你需要通过OS或使用其他IPC机制实现此功能。

由于这个主要原因,数据库被广泛使用。多个进程将能够读写数据到单个数据库。保护多个更新。