【发布时间】:2015-02-06 18:07:43
【问题描述】:
当被问到this question 时,我在完成我的示例时遇到了问题。
我在 Google 中搜索了实现 IPC 的方法。
我无法决定哪种方式最适合编写我的程序。
我尝试了很多实现,但遇到了很多复杂问题。
我想拥有:
1.父进程管理子进程-OK(模板)
2. 父子必须已经实现了新消息信号的回调
3. 一个进程不知道来自其他进程的消息大小(char *)
我的代码:
header.h:
#ifndef MESSAGES_H
#define MESSAGES_H
#include <stdio.h>
#include <stdlib.h>
// need here: some includes and definitions
inline char * read_message( /* need here: some params */ ) {
// need here: read message function
}
inline char * send_message( /* need here: some params */ ) {
// need here: send message function
}
#endif
父.c:
#include "header.h"
// parent specyfic includes and definitions
void on_message( /* need here: some parameters */ ) {
char *message = read_message( /* need here: some other parameters */ );
// do something with / if message etc.
}
int runChild(key) {
int pid = fork();
if (pid == 0) {
execl("./child", "./child", /* params here */, null);
}else{
return pid;
}
}
int main(int argc, char *argv[]) {
// need here: prepare IPC
// need here: on new message event call function "on_message"
int childPid = runChild(key);
// loop - for example: gtk_main()
// need here: close childs
}
child.c
#include "header.h"
// child specyfic includes and definitions
void on_message( /* need here: some parameters */ ) {
char *message = read_message( /* need here: some other parameters */ );
// do something with / if message etc.
}
int main(int argc, char *argv[]) {
// need here: prepare IPC
// need here: on new message event call function "on_message"
int pid = getpid();
int parentPid = getppid();
printf("Child with pid %d is ready for messages from parent with pid: %d", pid, parentPid);
// event loop - for example: gtk_main()
}
在该示例程序模板中哪种 IPC 方式更好(安全和速度)? 你能分享一个与上述模板匹配的非常简单的例子吗?
【问题讨论】:
-
在头文件中编写除内联以外的函数实现是一种不好的做法。
-
@jujj 已更正 - 谢谢
-
如果使用管道、命名管道或套接字进行通信,可以使用
fcntl(descriptor, F_SETFL, O_ASYNC)设置此描述符生成SIGIO信号;最好使用例如将其更改为实时信号。fcntl(descriptor, F_SETSIG, SIGRTMIN+0)。但是,信号处理程序只能使用async-signal safe 函数,否则应用程序行为未定义。