我有我需要来回通信在同一系统上2个应用程序。 从我的研究,我相信这就是所谓的进程间通信和使用socketpair的()是我的问题的最佳方法。
我撕我的头发(直译)试图开始建立与C. socketpair()插槽从我个人理解,插座是一个非常复杂的话题,我是一个新手C程序员肯定是没有帮助的情况。
我用Google搜索过去48小时,阅读教程等,但我仍然不能得到它。 我理解这个概念,但代码是太混乱。 我读过这篇文章了几声: http://beej.us/guide/bgnet/html/single/bgnet.html ,但它不是足够简单。
有人可以提供一些示例(如此简单第5年级的学生能理解),或指向我一个很好的教程?
您可以使用socketpair
只在您创建两个过程,就像这样:
- 调用
socketpair
-现在你有两个插座文件描述符(单管的两端) - 提名一端是父母和一个是孩子结束。 这并不重要,只是做出选择,坚持下去以后
- 叫
fork
-现在你有两个进程 - 如果
fork
回到零,你是孩子。 关闭父文件描述符,保住孩子的描述符,并把它作为管道的这个过程的结束 - 如果
fork
返回非零,你是家长。 关闭子文件描述符,保持母体之一,并使用它作为您的末端治理
- 你现在有两个过程,每个人都有代表同一管道的不同端一个文件描述符。 请注意,这两个进程都运行相同的程序,但他们遵循不同的分支呼叫后
fork
。 如果家长来电write
它的插座上, 孩子将能够从它的套接字读取这些数据,反之亦然
这里是一个直翻译成代码:
void child(int socket) {
const char hello[] = "hello parent, I am child";
write(socket, hello, sizeof(hello)); /* NB. this includes nul */
/* go forth and do childish things with this end of the pipe */
}
void parent(int socket) {
/* do parental things with this end, like reading the child's message */
char buf[1024];
int n = read(socket, buf, sizeof(buf));
printf("parent received '%.*s'\n", n, buf);
}
void socketfork() {
int fd[2];
static const int parentsocket = 0;
static const int childsocket = 1;
pid_t pid;
/* 1. call socketpair ... */
socketpair(PF_LOCAL, SOCK_STREAM, 0, fd);
/* 2. call fork ... */
pid = fork();
if (pid == 0) { /* 2.1 if fork returned zero, you are the child */
close(fd[parentsocket]); /* Close the parent file descriptor */
child(fd[childsocket]);
} else { /* 2.2 ... you are the parent */
close(fd[childsocket]); /* Close the child file descriptor */
parent(fd[parentsocket]);
}
exit(0); /* do everything in the parent and child functions */
}
请注意,这只是示例代码:我已经离开了所有的错误检查和明智的流协议。
如果你想两个独立的程序进行通信(例如,有一个名为客户端的可执行文件,一个叫服务器 ),则不能使用这种机制。 相反,你可以:
- 使用Unix套接字(其中一台主机上的IPC管是由文件名标识-这仅适用于如果客户端和服务器在同一台机器上运行)
- 或使用TCP / IP套接字(其中一个IP地址和端口标识管,并在客户端和服务器可以在不同的机器上)
如果没有特别需要插座,并且你很高兴,要求在同一台机器上的客户端和服务器端运行,您还可以使用共享内存或消息队列。
socketpair
创建匿名对插座,通常是UNIX /本地插座,其是仅在父母和孩子之间的过程或在其他情况下的通信有用的,其中需要使用它们可以从一个共同的祖先继承文件描述符的过程。
如果你打算做无关之间的通信(在亲子的感觉)的过程,你需要使用socket
, bind
,并connect
在一个过程中创建一个监听套接字,并创建一个客户端套接字连接到它的其它过程。
对于两个进程之间的通信,是的,进程间通信或IPC是你应该寻找什么。 套接字只是对通信的方法之一,如果你要实现一个一对多的连接是非常有用的。 装置,一个服务器进程,其与在请求 - 响应的方式许多客户端进程进行通信。 当你是一个新手,以IPC,这是可以理解的套接字地址和所涉及的细节可能看起来难以把握。 (虽然你会发现他们很容易在适当的时间:-))
对于你的问题,我建议你使用像钢管,FIFO,消息队列简单的IPC机制。 我不知道你是如何得出的结论使用socketpair。 既然你没有提到IPC左右你所需要的设计或那种任何事情,bassed上使用级别我强烈建议寻找到一些书籍或网络管道或FIFO示例代码。 他们应该看的方式更容易实现,比插座工作得更快。
使用TCP / IP。 虽然还有其他的IPC机制(如Unix域套接字和SYSV IPC)你与TCP / IP更好的原因有很多。 这里有一些:
- 有很多的教程和其他信息在网络上描述了怎么办TCP / IP
- 现代系统,尤其是Linux和* BSD,并处不显著处罚使用TCP / IP相比,比方说,Unix域套接字甚至SYSV IPC。
- 有许多库和框架,你可能能够利用通过TCP / IP通信应用。
在那里我不会使用TCP / IP,以两个“方案”之间沟通的唯一情况是,他们是真正的线程,而不是独立的程序的情况。