c-如何与分叉的后台进程进行通信/接口



很抱歉,如果标题没有任何意义,我只能这么称呼它。

我正在学习*nix系统(在我的情况下是Linux)中的进程是如何工作的,我知道一点,但如果可能的话,我想弄清楚如何做到这一点,我可能找不到任何信息,因为我不知道该怎么称呼它。

对我来说,最好的解释方式是举一个例子:

假设我有一个在终端上运行的音乐播放器,让我们称之为"音乐播放器"。我想播放一个声音文件,所以我会执行这个命令:

musicplayer play "/path/to/music.mp3"

然后这在后台运行,我在终端的提示下返回,我可以完全退出终端,听到后台的音乐等等。

唱到一半我想暂停:

musicplayer pause

一些音乐是如何暂停的。

这是怎么回事?(我的意思是,就过程而言,音乐只是一个例子,问题与音乐无关)。

在我看来,这就是正在发生的事情:[拨叉并播放音乐]->[告诉拨叉暂停]。

我对流程这个主题还不是很了解,所以非常感谢对此的任何帮助/解释。

我不一定需要代码示例,只是从逻辑上讲这是如何工作的,但如果你想给出示例,你可以在C.中给出

提前感谢您的解释。

您需要了解分叉进程不共享(隐式)任何数据;从概念上讲,父进程和子进程都有自己的地址空间,并有自己的数据副本(使用写时延迟复制技术)。参见货叉(2)

因此,您需要使它们显式地与pipe(7)-s、fifo(7)-s、socket(7)/s、共享内存shm_overview(7)和信号量sem_overview(7)、eventfd(2)或Linux提供的任何其他方式进行通信和同步。

因此,请阅读高级Linux编程,并了解Linux上可用于进行进程间通信的系统调用(2)。不要忘记处理系统调用失败。

对于music play命令,您将设置IPC和fork(另请参阅后台进程(3)以在后台派生后台进程)。

对于您的music pause,您将与其他进程进行通信。(您可能会考虑使用kill(2)使用SIGSTOP信号(7)来停止进程…)

你需要在脑海中建立一个所有可用IPC设施的图像,以选择与你的情况相关的设施

顺便说一句,Linux上有几个命令行音乐播放器是免费软件。你可以研究他们的源代码和/或strace(1)他们的执行。

我想为Basiles的答案添加一件事:这是一个非常常见的问题,所以几乎可以肯定的是,你不必自己处理细节(可能非常复杂)。好的应用程序框架将为您提供一个解决方案,这样您就可以集中精力使应用程序变得出色。

举个例子,看看GLibs GApplication:它处理应用程序的唯一性,因此第一个实例将继续运行,任何后续的应用程序调用都只会向原始实例发送一条D-Bus消息并退出。原始实例中的GApplication对象将发出一个信号,"告诉"您的应用程序,例如,音乐播放器实例是在命令行上启动的,参数是"暂停"。

最新更新