当我被问到这个问题时,我遇到了一个例子无法完成的问题。
我在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
parent.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方式更好(安全和速度)?你能分享一个符合上述模板的真正简单的例子吗?
GtkSocket
和GtkPlug
,它们允许一个GTK+应用程序嵌入来自另一个应用程序的小部件(该应用程序使用GTK+或Qt或其他遵循XEMBED规范的小部件)。 - Nominal Animalfcntl(descriptor, F_SETFL, O_ASYNC)
将此描述符设置为生成SIGIO信号;最好使用fcntl(descriptor, F_SETSIG, SIGRTMIN+0)
将其更改为实时信号。然而,信号处理程序必须仅使用异步信号安全函数,否则应用程序行为是未定义的。 - Nominal Animal