如何与分叉后台进程通信/接口?

时间:2014-08-30 05:45:08

标签: c linux process

很抱歉,如果标题没有任何意义,我可以考虑将其称为。<​​/ p>

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

我解释这个的最好方法是举个例子:

假设我有一个在终端中运行的音乐播放器,我们可以将其称为&#34; musicplayer&#34;。 我想播放一个声音文件,所以我会执行这个命令:

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

然后这在后台运行,我回到终端的提示符,我可以完全退出终端并听到背景音乐等等......

在歌曲中途说我想暂停一下:

musicplayer pause

音乐暂停的方式。

这将如何运作? (我的意思是就过程而言,音乐仅仅是一个例子,问题不在于音乐)。

在我看来,这就是发生的事情:[分叉播放音乐] - &gt; [告诉叉子暂停]。

我对流程的主题知之甚少,所以对此的任何帮助/解释都非常感谢。

我不一定需要代码示例,只是从逻辑上讲它是如何工作的,但是如果你想举例说明你可以用C语言给出它们。

提前感谢您的任何解释。

2 个答案:

答案 0 :(得分:2)

您需要了解分叉processes不共享(隐式)任何数据;从概念上讲,父进程和子进程各有自己的address space并拥有自己的数据副本(使用惰性copy on write技术)。见fork(2)

因此,您需要使用信号量{{pipe(7) - s,fifo(7) - s,socket(7) - s,共享内存shm_overview(7)进行显式通信和同步。 3}},sem_overview(7)或Linux为您提供的任何其他方式。

请阅读eventfd(2)并了解Linux上可用的Advanced Linux Programming syscalls(2)。不要忘记处理系统调用失败。

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

对于您的music pause,您将与其他流程进行通信。 (您可能会考虑使用daemon(3)使用SIGSTOP signal(7)停止此过程...)

您需要在脑中建立可用于选择与您的情况相关的所有IPC设施的图像

BTW,Linux上有几个命令行音乐播放器作为免费软件存在。您可以研究他们的源代码和/或kill(2)他们的执行。

答案 1 :(得分:2)

我想向Basiles回答一件事:这是一个非常普遍的问题,所以几乎可以肯定你不必自己处理细节(这可能非常复杂)。良好的应用程序框架将为您提供解决方案,以便您可以专注于使应用程序变得更好。

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