2018年2月26日

用信号量实现进程互斥示例和解决哲学家就餐问题

摘要: 一、我们在前面讲进程间通信的时候提到过进程互斥的概念,下面写个程序来模拟一下,程序流程如下图: 即父进程打印字符O,子进程打印字符X,每次打印一个字符后要sleep 一下,这里要演示的效果是,在打印程序的边界有PV操作,故每个进程中间sleep 的时间即使时间片轮转到另一进程,由于资源不可用也不会穿 阅读全文

posted @ 2018-02-26 14:40 AlanTu 阅读(2352) 评论(0) 推荐(0) 编辑

封装一个信号量集操作函数的工具

摘要: 信号量的概念参见这里。 与消息队列和共享内存一样,信号量集也有自己的数据结构: struct semid_ds { struct ipc_perm sem_perm; /* Ownership and permissions */ time_t sem_otime; /* Last semop ti 阅读全文

posted @ 2018-02-26 14:38 AlanTu 阅读(474) 评论(0) 推荐(0) 编辑

System V 共享内存 和 系列函数

摘要: 跟消息队列一样,共享内存也有自己的数据结构,如下: struct shmid_ds { struct ipc_perm shm_perm; /* Ownership and permissions */ size_t shm_segsz; /* Size of segment (bytes) */ 阅读全文

posted @ 2018-02-26 14:36 AlanTu 阅读(333) 评论(0) 推荐(0) 编辑

共享内存简介和mmap 函数

摘要: 一、共享内存简介 共享内存区是最快的IPC形式,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 即每个进程地址空间都有一个共享存储器的映射区,当这块区域都映射到相同的真正的物理地址空间时,可以通过这块区域进行数据交换,例如共享库就是这么实现的,很多进 阅读全文

posted @ 2018-02-26 14:34 AlanTu 阅读(2009) 评论(0) 推荐(0) 编辑

消息队列实现回射客户/服务器和 msgsnd、msgrcv 函数

摘要: 一、msgsnd 和 msgrcv 函数 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 功能:把一条消息添加到消息队列中 原型 int msgsnd(int msqid, const void *msgp, size 阅读全文

posted @ 2018-02-26 14:33 AlanTu 阅读(1488) 评论(0) 推荐(0) 编辑

消息队列内核结构和msgget、msgctl 函数

摘要: 一、消息队列 1、消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 2、每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 3、消息队列与管道不同的是,消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定是先入先出。 4、消息队列也有管道一样的不足,就 阅读全文

posted @ 2018-02-26 14:30 AlanTu 阅读(5934) 评论(0) 推荐(0) 编辑

进程间通信概述

摘要: 一、顺序程序与并发程序特征 顺序程序特征 顺序性 封闭性:(运行环境的封闭性) 确定性 可再现性 并发程序特征 共享性 并发性 随机性 二、进程互斥 1、由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥 2、系统中某些资源一次只允许一个进程使 阅读全文

posted @ 2018-02-26 14:27 AlanTu 阅读(277) 评论(0) 推荐(0) 编辑

通过UNIX域套接字传递描述符和 sendmsg/recvmsg 函数

摘要: 在前面我们介绍了UNIX域套接字编程,更重要的一点是UNIX域套接字可以在同一台主机上各进程之间传递文件描述符。 下面先来看两个函数: #include <sys/types.h> #include <sys/socket.h> ssize_t sendmsg(int sockfd, const s 阅读全文

posted @ 2018-02-26 14:25 AlanTu 阅读(1292) 评论(0) 推荐(0) 编辑

UNIX域套接字编程和socketpair 函数

摘要: 一、UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX D 阅读全文

posted @ 2018-02-26 14:23 AlanTu 阅读(3225) 评论(0) 推荐(1) 编辑

基于UDP协议的网络程序

摘要: 一、下图是典型的UDP客户端/服务器通讯过程 下面依照通信流程,我们来实现一个UDP回射客户/服务器 #include <sys/types.h> #include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t len 阅读全文

posted @ 2018-02-26 14:21 AlanTu 阅读(2387) 评论(0) 推荐(0) 编辑

epoll 系列函数简介、与select、poll 的区别

摘要: 一、epoll 系列函数简介 #include <sys/epoll.h> int epoll_create(int size); int epoll_create1(int flags); int epoll_ctl(int epfd, int op, int fd, struct epoll_e 阅读全文

posted @ 2018-02-26 14:20 AlanTu 阅读(2681) 评论(0) 推荐(0) 编辑

select函数的并发限制和 poll 函数应用举例

摘要: 一、用select实现的并发服务器,能达到的并发数,受两方面限制 1、一个进程能打开的最大文件描述符限制。这可以通过调整内核参数。可以通过ulimit -n来调整或者使用setrlimit函数设置, 但一个系统所能打开的最大数也是有限的,跟内存大小有关,可以通过cat /proc/sys/fs/fi 阅读全文

posted @ 2018-02-26 14:18 AlanTu 阅读(681) 评论(0) 推荐(0) 编辑

套接字I/O超时设置方法和用select实现超时

摘要: 注:如无特殊说明,sockfd 原始状态都是阻塞的。 一、使用alarm 函数设置超时 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 void handler(int sig) { } signal(SIGALRM, handler); alarm(5); int r 阅读全文

posted @ 2018-02-26 14:16 AlanTu 阅读(987) 评论(0) 推荐(0) 编辑

shutdown 与 close 函数 的区别

摘要: 假设server和client 已经建立了连接,server调用了close, 发送FIN 段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过socket发送和接收数据,此时client调用read,如果接收到FIN 段会返回0,但client此时还是可以write 阅读全文

posted @ 2018-02-26 14:13 AlanTu 阅读(285) 评论(0) 推荐(0) 编辑

使用select函数改进客户端/服务器端程序

摘要: 一、当我们使用单进程单连接且使用readline修改后的客户端程序,去连接使用readline修改后的服务器端程序,会出现一个有趣的现象,先来看输出: 先运行服务器端,再运行客户端, simba@ubuntu:~/Documents/code/linux_programming/UNP/socket 阅读全文

posted @ 2018-02-26 14:11 AlanTu 阅读(1442) 评论(0) 推荐(0) 编辑

五种I/O模型和select函数简介

摘要: 一、五种I/O模型 1、阻塞I/O 我们在前面所说的I/O模型都是阻塞I/O,即调用recv系统调用,如果没有数据则阻塞等待,当数据到来则将数据从内核空间(套接口缓冲区)拷贝到用户空间(recv函数提供的buf),然后recv返回,进行数据处理。 2、非阻塞I/O 我们可以使用 fcntl(fd, 阅读全文

posted @ 2018-02-26 14:08 AlanTu 阅读(913) 评论(0) 推荐(0) 编辑

一个进程发起多个连接和gethostbyname等函数

摘要: 一、在前面讲过的最简单的回射客户/服务器程序中,一个客户端即一个进程,只会发起一个连接,只要稍微修改一下就可以让一个客户端发起多个连 接,然后只利用其中一个连接发送数据。 先来认识一个函数getsockname #include <sys/socket.h> int getsockname(int 阅读全文

posted @ 2018-02-26 14:05 AlanTu 阅读(589) 评论(0) 推荐(0) 编辑

利用recv和readn函数实现readline函数

摘要: 在前面的文章中,我们为了避免粘包问题,实现了一个readn函数读取固定字节的数据。如果应用层协议的各字段长度固定,用readn来读是非常方便 的。例如设计一种客户端上传文件的协议,规定前12字节表示文件名,超过12字节的文件名截断,不足12字节的文件名用'\0'补齐,从第13字节开始是 文件内容,上 阅读全文

posted @ 2018-02-26 14:03 AlanTu 阅读(942) 评论(1) 推荐(2) 编辑

tcp流协议产生的粘包问题和解决方案

摘要: 我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议 阅读全文

posted @ 2018-02-26 14:01 AlanTu 阅读(873) 评论(0) 推荐(0) 编辑

使用fork并发处理多个client的请求和对等通信p2p

摘要: 一、在前面讲过的回射客户/服务器程序中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较老土的办法是使用fork来实现。网络服务器通常用fork来同时服务多个客户端,父进程专门负责监听端口,每次accept一个新的客户端连接就f 阅读全文

posted @ 2018-02-26 13:59 AlanTu 阅读(716) 评论(0) 推荐(0) 编辑

导航