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 · 233 阅读 · 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 · 268 阅读 · 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 · 2707 阅读 · 2 评论 -
进程间通信方法一:管道:pipe()、fifo
管道 管道的实现原理是内核使用循环队列机制,借助内核缓冲区(4K)实现 管道的局限性: 由于管道采用半双工的通信方式,所以数据只能在一个方向上流动,要不读要不写(读、写只能占一样) 数据一旦被读走,便不在管道中留存,只能读取一次 只能在有公共祖先的进程间使用管道 pipe函数 函数原型 int pipe(int pipefd[2]); 返回值 成功返回0;失败返回-1 函数调用成功后,返回两个文件描述符(r/w),无需手动open,但需手动close pipefd[0]:读文件描述符 pipefd[1原创 2020-10-25 17:53:08 · 248 阅读 · 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 · 5682 阅读 · 0 评论 -
多路IO转接服务器实现方法三:epoll()函数
epoll是Linux下多路复用接口select/poll的增强版本。 它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用每次等待时间之前都必须重新准备要被监听的文件描述符集合 获取事件的时候,它无须遍历整个被监听的文件描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了 目前epoll是Linux大规模并发网络程序中的热门首选模型 除了提供select/poll那种IO事件的电平触发外,还提供了边沿触发,这使得原创 2020-11-12 18:31:50 · 201 阅读 · 0 评论 -
Linux系统编程之进程间通信二:内存映射区
1 内存映射区 1.1mmap函数 函数功能 创建内存映射 将磁盘文件的数据映射到内存中,用户通过修改内存就能修改磁盘文件 函数原型 length:大小为4K的倍数,且不能为0。 一般文件多大,映射区的大小就指定为多大 prot: PROT_READ:映射区必须要有读权限 PROT_WRITE 读写权限是:PROT_READ|PROT_WRITE flags: MAP_SHARED:修改了内存数据会同步到磁盘 MAP_PRIVATE:修改了内存数据不会同步到磁盘 fd:要映射的文件原创 2020-10-26 21:06:49 · 288 阅读 · 0 评论 -
多路IO转接服务器实现方法二:poll()函数
相较于多路IO转接服务器实现方法一:select()函数,使用poll()函数的优点有 文件描述符的上限可以突破1024 select()函数监听集合与返回的满足监听条件的集合为一个集合,而poll函数将监听集合与符合监听条件的集合实现了分离 搜索满足条件的文件描述符的范围缩小了 但,poll函数不能实现跨平台,只能在Linux平台上使用,而select()函数可以跨平台 poll()函数 函数原型 int poll(struct pollfd *fds, nfds_t nfds, int timeou原创 2020-11-11 21:22:00 · 200 阅读 · 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 7777 int c原创 2020-11-07 12:03:56 · 310 阅读 · 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 · 345 阅读 · 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 · 582 阅读 · 0 评论 -
多路IO转接服务器实现方法一:select()函数
采用多进程与多线程的方法来实现并发服务器时,监听的工作由server应用程序自身通过accept函数不断去监听。当客户端连接较多时,这种方法会大大降低程序执行效率,消耗CPU资源(CPU需要在不同进/线程中切换执行)。 多进程与多线程实现并发服务器方法可以参考以下两篇文章: 多进程并发服务器实现 多线程并发服务器实现 因为以上两种方法的局限性所以出现了采用多路IO转接的方式来设计服务器,该类服务器实现的思想为应用程序本身不在监听客户端连接,转而由内核来代替监听。主要使用的方法有三种,其一为 select原创 2020-11-11 14:06:59 · 185 阅读 · 0 评论
分享