2014-08-30 45 views
0

对不起,如果标题没有任何意义,这是我所能想到的。如何与分叉后台进程进行通信/接口?

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

我解释这将是举个例子,最好的办法:

说我有工作在终端中的音乐播放器,让我们把它称为“musicplayer”。 我想播放声音文件,所以我会执行此命令:

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

那么这会在后台运行,我回到了我在终端提示,我可以从完全退出终端和听到背景等音乐...

说半途首歌我想暂停:

musicplayer pause

一些如何在音乐停顿d。

这将如何工作? (我的意思是在这个过程中,音乐只是一个例子,问题不在于音乐)。

在我看来,这就是发生了什么:[fork and play music] - > [告诉fork暂停]。

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

我不需要代码示例必然,只是在逻辑上这是如何工作的,但如果你想给你的例子可以给他们在C.

先感谢您的任何解释。

+0

实际上并不需要(也不是)这里涉及的任何“分支”(不包括将进程作为守护进程运行);随后每次调用'musicplayer'可执行文件都会启动一个新的*独立*进程。 – user2864740 2014-08-30 06:20:07

回答

2

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

因此,你需要让他们明确地沟通和pipe(7) -s,fifo(7) -s,socket(7) -s,共享内存shm_overview(7)旗语sem_overview(7),同步eventfd(2)或任何其他意味着Linux提供你。

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

对于您的music play命令,您可以设置IPC和fork(另请参阅daemon(3)以在后台分支守护进程)。

对于你的music pause你会与其他进程通信。 (您可能会考虑使用kill(2)停止SIGSTOP​​的过程...)

你需要在你的脑袋建设的所有可用来选择相关的那些IPC功能的图像您的具体情况

BTW,在Linux上存在一些命令行音乐播放器为免费软件。你可以研究他们的源代码和/或他们的执行。

+0

我明白了。感谢所有的信息(在您编辑的过程中保持阅读!:D)。我认为最好的做法可能是使用套接字进行通信。我一定会看看你链接的阅读材料。再次感谢。 – APott 2014-08-30 05:57:18

+0

太棒了。感谢您的例子。这篇文章帮助了很多,谢谢! – APott 2014-08-30 06:03:38

2

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

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

相关问题