
linux
文章平均质量分 92
~
从此开始低调范✌️
这个作者很懒,什么都没留下…
展开
-
进程间通信方法三:本地套接字domain
代码中注释已写的很详细,就不多言了注意事项保证套接字文件在同一个目录下网络套接字与本地套接字使用的结构体不同网络套接字采用的结构体为struct sockaddr_in本地套接字采用的结构体为struct sockaddr_un服务端offsetof宏函数原型#define offsetof(type,member) ((int)&((type*)0)->MEMBER#include <stdio.h>#include <sys/soc原创 2020-11-17 22:21:25 · 197 阅读 · 0 评论 -
Linux系统编程之多进程并发服务器简单实现
服务端#include<stdio.h>#include<stdlib.h>#include<signal.h>#include<unistd.h>#include<fcntl.h>#include<string.h>#include<sys/socket.h>#include<arpa/inet.h>#define PORT 8888#define IP "127.0.0.1"void原创 2020-11-08 22:10:40 · 221 阅读 · 0 评论 -
Linux系统编程之readdir()函数判断目录是否为空的问题
由于Linux目录中总是存在”.“、”.“两个隐藏目录,所以在用readdir()函数判断是否为空时,得到的结果总是目录不为空。但是现实中对于如果目录中没有自己的文件就应该被判为空,所以在多次测试之后得到下面这段判断目录是否为空的方法。第一种代码:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<string.h>#includ原创 2020-10-21 16:48:20 · 2599 阅读 · 2 评论 -
进程间通信方法一:管道:pipe()、fifo
管道管道的实现原理是内核使用循环队列机制,借助内核缓冲区(4K)实现管道的局限性:由于管道采用半双工的通信方式,所以数据只能在一个方向上流动,要不读要不写(读、写只能占一样)数据一旦被读走,便不在管道中留存,只能读取一次只能在有公共祖先的进程间使用管道pipe函数函数原型int pipe(int pipefd[2]);返回值成功返回0;失败返回-1函数调用成功后,返回两个文件描述符(r/w),无需手动open,但需手动closepipefd[0]:读文件描述符pipefd[1原创 2020-10-25 17:53:08 · 215 阅读 · 0 评论 -
Linux系统调用函数read()返回值判断
函数原型read(int fd,void* buf,size_t count);函数说明将从文件描述符fd对应的文件中读到的数据存在buf缓冲区中,每次读count字节,同时文件指针会随着移动函数返回值当返回值大于0时:实际读到的字节数返回值=0:说明数据读完了,(读到文件、管道、socket末尾)返回值为-1:异常errno == EINTR 被信号中断errno == EAGAIN(EWOULDBLOCK) 非阻塞方式读,并且没有数据其他值 代表 出现错误,可以获得返回值,然后利原创 2020-11-07 15:02:14 · 5433 阅读 · 0 评论 -
多路IO转接服务器实现方法三:epoll()函数
epoll是Linux下多路复用接口select/poll的增强版本。它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用每次等待时间之前都必须重新准备要被监听的文件描述符集合获取事件的时候,它无须遍历整个被监听的文件描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了目前epoll是Linux大规模并发网络程序中的热门首选模型除了提供select/poll那种IO事件的电平触发外,还提供了边沿触发,这使得原创 2020-11-12 18:31:50 · 170 阅读 · 0 评论 -
Linux系统编程之进程间通信二:内存映射区
1 内存映射区1.1mmap函数函数功能创建内存映射将磁盘文件的数据映射到内存中,用户通过修改内存就能修改磁盘文件函数原型length:大小为4K的倍数,且不能为0。一般文件多大,映射区的大小就指定为多大prot:PROT_READ:映射区必须要有读权限PROT_WRITE读写权限是:PROT_READ|PROT_WRITEflags:MAP_SHARED:修改了内存数据会同步到磁盘MAP_PRIVATE:修改了内存数据不会同步到磁盘fd:要映射的文件原创 2020-10-26 21:06:49 · 240 阅读 · 0 评论 -
多路IO转接服务器实现方法二:poll()函数
相较于多路IO转接服务器实现方法一:select()函数,使用poll()函数的优点有文件描述符的上限可以突破1024select()函数监听集合与返回的满足监听条件的集合为一个集合,而poll函数将监听集合与符合监听条件的集合实现了分离搜索满足条件的文件描述符的范围缩小了但,poll函数不能实现跨平台,只能在Linux平台上使用,而select()函数可以跨平台poll()函数函数原型int poll(struct pollfd *fds, nfds_t nfds, int timeou原创 2020-11-11 21:22:00 · 163 阅读 · 0 评论 -
Linux系统编程之多线程并发服务器简单实现
服务端#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<string.h>#include<pthread.h>#include<sys/socket.h>#include<arpa/inet.h>#define IP "127.0.0.1"#define PORT 7777int c原创 2020-11-07 12:03:56 · 252 阅读 · 0 评论 -
Linux系统编程之wait()函数回收子进程
函数原型pid_t wait(int* status);返回值成功:清理掉的子进程ID失败:-1(没有子进程)函数功能阻塞等待子进程退出回收子进程残留资源获取子进程结束状态进程终止时,操作系统会进行隐式回收。包括关闭所有的文件描述符,释放用户空间分配的内存。但是此时进程控制块PCB仍然会残留在内核中,保留着此进程结束的状态#include<stdio.h>#include<stdlib.h>#include<unistd.h>#in原创 2020-10-25 13:33:51 · 294 阅读 · 0 评论 -
epoll函数之边缘触发、水平触发、非阻塞IO模式
边沿触发与水平触发这两个实际是由模拟电路上的高低电频来的,低电压(0)到高电压(1)为上升沿,高电压(1)到低电压(0)为下降沿,高电压(1)到高电压(1)为水平沿。水平沿对应水平触发,上升、下降沿对应边沿触发边沿触发:epoll ET模式水平触发:epoll LT模式通俗的说,当客户端向服务端写数据,假如1000B的数据,服务端第一次读了500B后,还剩下500B在缓冲区中,假如此时能触发epoll_wait函数的监听读事件,就叫水平触发,假如此时epoll_wait函数不触发,那么就原创 2020-11-12 22:39:51 · 466 阅读 · 0 评论 -
多路IO转接服务器实现方法一:select()函数
采用多进程与多线程的方法来实现并发服务器时,监听的工作由server应用程序自身通过accept函数不断去监听。当客户端连接较多时,这种方法会大大降低程序执行效率,消耗CPU资源(CPU需要在不同进/线程中切换执行)。多进程与多线程实现并发服务器方法可以参考以下两篇文章:多进程并发服务器实现多线程并发服务器实现因为以上两种方法的局限性所以出现了采用多路IO转接的方式来设计服务器,该类服务器实现的思想为应用程序本身不在监听客户端连接,转而由内核来代替监听。主要使用的方法有三种,其一为 select原创 2020-11-11 14:06:59 · 132 阅读 · 0 评论