首页 > 编程知识 正文

三种通信方式(php进程间通信的方式)

时间:2023-05-05 11:45:50 阅读:74072 作者:759

进程通信:

每个进程都有不同的用户地址空间,一个进程的全局变量对另一个进程不可见,因此在进程之间交换数据需要通过内核,在内核中打开缓冲区,而进程a将数据从用户空间传递到内核缓冲区内核提供的该机制称为进程间通信。

3358 www.Sina.com/http://www.Sina.com/管道是半双工通信方式,数据只有http://www.Sina.com /,而且只能在有血缘关系的进程之间使用。 的亲缘关系通常为1 匿名管道通信

//所需头文件#includeunistd.h//pipe (使用函数创建匿名管道) /返回值:成功返回0,返回-1//fd参数,两个文件描述符)//FD )表示管道要通过匿名管道实现进程间通信,请执行以下操作:

父进程创建管道,以确保两个部件描述符指向管道两端的父进程fork子进程,并且两个部件描述符也指向同一管道。 父进程关闭软盘[0],子进程关闭软盘[1]。 这意味着进程关闭管道的读取端,进程关闭管道的写入端(因为管道只支持单向通信)。 进程可以写入管道,进程可以从管道读取,管道通过环形队列实现,数据从写入端的流流向读取端,实现进程间通信。 有关详细信息,请参阅文章。 进程之间的通信方式——pipe (管道)。

33558www.Sina.com/popen :如果将另一个程序作为新进程在当前程序进程中启动,它将成为当前程序的子进程。 这种方式将是我们高级的流水线方式。

匿名管道(pipe ):知名管道(named pipe ) )知名管道也是半双工通信方式,但允许无血缘关系过程之间的通信。

单向流动消息队列(消息队列)消息队列是消息的链表,存储在内核中,由消息队列标识符标识。 消息队列克服了消息传递信息少、只能包含管道未格式化的字节流、缓冲区大小受限等缺点。

父子进程关系信号(semophore ) :信号是一个计数器,可用于控制多个进程对共享资源的访问。 这经常用作锁定机制,防止一个进程访问共享资源时其他进程也不访问该资源。 因此,它主要成为进程之间以及同一进程内不同线程之间的同步手段。

2 高级管道通信信号(sinal ) )信号是一种比较复杂的通信方式,用于通知接收进程发生了某个事件。

3 有名管道通信共享内存(shared memory ) :共享内存是指映射由一个进程创建但可以由多个进程访问的另一个进程访问的内存。 共享内存是最快的IPC方式,专门针对其他进程间通信方式的执行效率低而设计。 这往往与其他通信机制(如信号2 )协作,实现进程之间的同步和通信。

4 消息队列通信套接字(套接字) )套接字接口也是进程间通信机制,与其他通信机制不同,可用于不同设备之间的进程通信。

我以前写过一个课程设计:基于互联网的Linux客户端/服务器系统的通信设计和实现

利用sock通信实现了。 请作为参考。

通信流程如下。

5 信号量通信SOCK_STREAM格式的本地套接字通信都需要本地地址。 其中,必须明确指定服务器端的本地地址。 指定方法使用结构sockaddr _ un类型的变量。

基于6 信号SOCK_STREAM的本地套接字通信都需要本地地址。 其中,必须明确指定服务器端的本地地址。 指定方法是使用struct sockaddr_un类型的变量为相应的字段赋值,绑定到创建的服务器套接字,然后绑定到使用bind系统调用

intbind(intsocket,const struct sockaddr *address,size_t address_len ); 其中socket表示服务器端套接字描述符,address表示绑定的本地地址,struct sockaddr_un类型的变量,address_len表示该本地地址的字节长度。

7 共享内存通信服务器端套接字创建完成,提供本地地址值(名称,在本例中为Server Socket ) ),然后进行监听并等待客户端连接处理请求

n 系统调用,接受客户端连接使用accept系统调用,它们的原形如下:

int listen(int socket, int backlog);int accept(int socket, struct sockaddr *address, size_t *address_len);

其中 socket 表示服务器端的套接字描述符;backlog 表示排队连接队列的长度(若有多个客户端同时连接,则需要进行排队);address 表示当前连接客户端的本地地址,该参数为输出参数,是客户端传递过来的关于自身的信息;address_len 表示当前连接客户端本地地址的字节长度,这个参数既是输入参数,又是输出参数。


8.4 连接服务器

客户端套接字创建完毕并赋予本地地址值后,需要连接到服务器端进行通信,让服务器端为其提供处理服务。

对于SOCK_STREAM类型的流式套接字,需要客户端与服务器之间进行连接方可使用。连接要使用 connect 系统调用,其原形为

int connect(int socket, const struct sockaddr *address, size_t address_len);

其中socket为客户端的套接字描述符,address表示当前客户端的本地地址,是一个 struct sockaddr_un 类型的变量,address_len 表示本地地址的字节长度。实现连接的代码如下:

connect(client_sockfd, (struct sockaddr*)&client_address, sizeof(client_address));


8.5 相互发送接收数据

无论客户端还是服务器,都要和对方进行数据上的交互,这种交互也正是我们进程通信的主题。一个进程扮演客户端的角色,另外一个进程扮演服务器的角色,两个进程之间相互发送接收数据,这就是基于本地套接字的进程通信。发送和接收数据要使用 write 和 read 系统调用,它们的原形为:

int read(int socket, char *buffer, size_t len);int write(int socket, char *buffer, size_t len);

其中 socket 为套接字描述符;len 为需要发送或需要接收的数据长度;

对于 read 系统调用,buffer 是用来存放接收数据的缓冲区,即接收来的数据存入其中,是一个输出参数;

对于 write 系统调用,buffer 用来存放需要发送出去的数据,即 buffer 内的数据被发送出去,是一个输入参数;返回值为已经发送或接收的数据长度。


8.6 断开连接

交互完成后,需要将连接断开以节省资源,使用close系统调用,其原形为:

int close(int socket);


参考资料:

进程间的通信方式——pipe(管道)Linux下socket编程实现客户机服务器通信的例子Linux进程间套接字(Socket)通信基于Internet的Linux客户机/服务器系统通讯设计与实现

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。