
Unix/Linux
Erick_Lv
菜鸡互啄
展开
-
Linux线程基础
简介创建线程#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);thread:线程标识符attr:线程的属性,设置为NULL则...原创 2019-02-14 14:42:45 · 141 阅读 · 0 评论 -
Posix读写锁
简介在上一篇笔记中记录的Posix基本锁,是最一般的情况,一个互斥量只能同时被一个线程所拥有。这篇笔记主要记录了读写锁,可以有多个读线程同时获取读的锁,而只有一个线程可以获取写的锁。读锁和写锁互斥,写锁和写锁互斥。初始化读写锁int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthr...原创 2019-02-14 20:05:56 · 447 阅读 · 0 评论 -
TCP通过带外数据实现心跳检测机制
带外数据以及Linux下的设置带外数据的概念:建立连接的双端,如果有一端有紧急的消息,可以立刻通知对方,而不是通过消息排队的机制进行告知。TCP没有真正的带外数据,而是设置了紧急指针来实现这一模式的。带外数据只有一个字节,如果发送多个带外数据,那么只有最后一个字符会被作为带外数据进行传输。接收方如果收到带外数据,内核会向进程发送SIGURG信号,我们可以根据这个信号来调用有关的处理函数。在...原创 2019-02-03 15:53:35 · 1204 阅读 · 0 评论 -
Linux\Unix线程的互斥锁和条件变量
互斥锁互斥锁是线程之间最基本的同步形式,用于保护临界区,任意时刻只能有一个线程在临界区中执行。初始化#include &amp;amp;lt;pthread.h&amp;amp;gt;int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);mutex:初始化锁的标识符attr:锁的属性,如...原创 2019-02-14 16:45:31 · 344 阅读 · 0 评论 -
动态多进程服务器
简介对于并发服务器来说,最简单的方式是每个客户端对应一个处理进程,防止主线程仅仅响应一个客户端。fork()是Linux/Unix创建进程的唯一方式,所以肯定使用这个进程。在这里先不考虑使用进程池的情况。当一个客户端离开的时候,或者说我们服务完成一个客户端,此时子进程就需要关闭连接,而且父进程需要关闭这个子进程。Linux/Unix中,如果子进程状态发生变化,则系统向父进程发送SIGCHILD...原创 2019-02-01 22:31:21 · 149 阅读 · 0 评论 -
Linux下的信号处理
最基本的信号处理函数signal函数原型:#include &amp;amp;amp;amp;amp;amp;amp;lt;signal.h&amp;amp;amp;amp;amp;amp;amp;gt;typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);signum参数:传入的信号类型handler参数:处理信号的函数,函数接受一个整型原创 2019-01-16 18:39:10 · 775 阅读 · 0 评论 -
Linux创建多个进程
利用fork()的特性和break中断进程处理,子进程在fork()处进行执行,父进程返回子进程的pid,子进程返回0;同时父进程有一个统计子进程数量的num变量,防止生产者子进程创建后续的进程,详情参照代码。代码实例:#include &amp;lt;stdio.h&amp;gt;#include &amp;lt;wait.h&amp;gt;#include &amp;lt;unistd.h&amp;g原创 2019-01-21 21:22:23 · 2817 阅读 · 0 评论 -
Linux多进程编程(1)
fork函数与exec系列函数系统调用fork系统调用用于产生一个子进程,下面是基础用法:#include &amp;lt;sys/types.h&amp;gt;#include &amp;lt;unistd.h&amp;gt;pid_t fork(void);父进程中的该函数返回子进程的PID,子进程中的该函数返回0,失败返回-1,并设置errno。这篇博客给了两个实例,因此在这里不在给代码实例。几个说明点:...原创 2019-01-20 15:42:48 · 264 阅读 · 0 评论 -
Linux基于升序链表的定时器
模式简介这是基于SIGALRM信号的定时器,关于该信号,可以参考这篇博客:https://blog.youkuaiyun.com/qq_35976351/article/details/86532889本文来自于《Linux高性能服务器》这本书,不过把升序链表改成带有头结点和尾结点的结构了,这两个节点不存储数据,只是为了操作方便。升序链表的模式作用如下:每隔固定的时间,就去扫描链表上的定时器。链表上的每...原创 2019-01-20 13:48:37 · 476 阅读 · 0 评论 -
Linux下的进程池(1)
简介基于Linux的进程池的实现,原创 2019-02-03 21:43:18 · 383 阅读 · 0 评论 -
Linux下的进程池(2)
简介在上篇笔记中,记录了无锁的accept结构,但是出现惊群现象。最简单的避免方式是添加一个信号量锁即可,参考这篇笔记即可。代码仅仅添加几行改动,客户端使用前一个笔记的。给出代码:#include <sys/socket.h>#include <sys/types.h>#include <stdio.h>#include <stdlib.h&...原创 2019-02-03 22:46:05 · 260 阅读 · 0 评论 -
Linux的辅助数据和传递文件描述符
简介首先,明确传递文件描述符的意义。一般来说,在多进程网络编程中,我们设置一个主进程用于监听新来的连接,设置一个进程池,用于处理这些连接。但是,与线程池不同,进程池各个进程之间的空间是独立的,直接共享主进程建立新连接的文件描述符,此时,需要主进程发送连接文件描述符给子进程。文件描述符本身仅仅是个数字,具体回顾这个笔记。传递文件描述符只是一个比较方便的称呼,而本质上传递的是文件描述符对应内核中的...原创 2019-02-05 19:41:26 · 804 阅读 · 0 评论 -
System V消息队列
简介这篇笔记中介绍了消息队列的基本知识和Posix消息队列。这篇笔记主要学习记录System V消息队列,并对比两个消息队列。System V消息队列是更早的一个消息队列的实现。Posix消息队列接口简单,但是缺陷之一是只能获取最高优先级的消息;而System V队列与之的最大的区别就是在消息类型和优先级上更加灵活。System V消息队列也是随内核持续的,而且也是链式结构实现的。基本操作...原创 2019-02-12 00:35:27 · 268 阅读 · 0 评论 -
Linux的sigevent结构----mq_notify()实例
sigevent简介mq_notify()简介在这篇笔记中介绍了Posix消息队列的一般操作。在这里单独介绍代码实例#include &lt;pthread.h&gt;#include &lt;mqueue.h&gt;#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;unist原创 2019-02-11 21:35:15 · 6608 阅读 · 0 评论 -
Posix消息队列
简介之前的几个笔记,主要介绍了IPC的管道和FIFO通信方式。在这里再次明确一点,IPC的本质作用是用于进程之间的通信。管道的使用方式简单,生命周期是跟随进程的;但是,管道有自身的缺陷,个人总结为3点:管道更适合进程端对端的通信,即在两个进程之间建立一个通信管道,如果有多个进程想要通过管道进行通信,那么需要建立多个管道。如果建立管道,那么必须先有管道的读出端进程,否则仅仅有写入端的管道是无...原创 2019-02-11 17:06:55 · 764 阅读 · 0 评论 -
Linux打开文件操作的注意事项
首先明确一点,Linux系统中,权限是非常重要的。在很多Linux创建类型的函数中,一般都有两组类型的参数列表,类似于open函数;或者说,它们和open函数的使用方式一致:#include &lt;sys/types.h&gt;#include &lt;sys/stat.h&gt;#include &lt;fcntl.h&gt;int open(const char *pathname...原创 2019-02-10 21:58:33 · 483 阅读 · 0 评论 -
Linux IPC之有名管道
简介无名管道在这篇笔记中有详细的介绍,包括半双工的pipe和全双工的socketpair;两者的共同特点是只能用于有亲缘关系的进程,比如父子进程。如果想要在任意进程间使用管道进行通信,则需要借助有名管道,即mkfifo来实现:#include &amp;amp;lt;sys/types.h&amp;amp;gt;#include &amp;amp;lt;sys/stat.h&amp;amp;gt;int mkfifo(const cha原创 2019-02-10 16:28:00 · 228 阅读 · 0 评论 -
Linux下的进程池(3)
简介在上一篇笔记中,提到了使用信号量来处理多进程的“惊群”现象。这也不是一个好的方式,因为多进程可能同时都在处理大量的任务,导致无法及时接受连接。同时,这也无法进行负载均衡。在这里,给出传递文件描述符的方式,主进程负责接受连接,然后根据子进程的连接数量,分配连接给最少的子进程。传递文件描述符的算法参考这篇笔记。代码实例代码的假设前提是客户端不会主动断开连接。#include &amp;lt;sys...原创 2019-02-09 19:41:50 · 366 阅读 · 0 评论 -
System V信号量
在上一篇笔记中,学习了Posix信号量。这篇笔记主要学习System V信号量,该信号量增加了信号量集的方式。创建#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>int semget(key_t key, int nsems, int semflg);key:信号量的标识...原创 2019-02-16 11:23:16 · 287 阅读 · 0 评论 -
Posix信号量
简介Posix信号量是进程之间的wait和signal操作;这是一种有名的信号量,通过路径名进行访问;该信号量是由用户来维护的。信号量作用更适合于共享内存或者共享文件的操作。以下所有的使用都需要添加-pthread连接初始化#include <fcntl.h> /* For O_* constants */#include <sys/stat.h&g...原创 2019-02-16 10:21:21 · 332 阅读 · 0 评论 -
Linux使用I/O复用函数的超时机制的定时器
I/O复用超时机制原创 2019-01-19 10:37:07 · 457 阅读 · 0 评论 -
Linux多进程编程(2)
进程的信号量机制进程间共享内存原创 2019-01-23 22:07:00 · 547 阅读 · 0 评论 -
I/O操作不占用CPU的任何线程
原文链接:http://blog.stephencleary.com/2013/11/there-is-no-thread.html转载 2018-12-18 16:09:00 · 3740 阅读 · 0 评论 -
select、poll和epoll的总结对比
综述首先要搞明白两个基本概念:I/O复用和(非)阻塞机制。I/O复用指的是允许计算机执行或者阻塞在一组数据流上,直到某个到达唤醒阻塞的进程,此时的I/O信道不仅仅是通过一个数据流,而是一组,所以是复用。阻塞和非阻塞:拿I/O为例子,如果是阻塞模型,那么程序一直会等到有数据来的时候才会继续向下执行,否则会一直等待数据的到来;如果是非阻塞模型,如果有数据,那么直接读取数据向下执行,没有数据也会继...原创 2018-12-24 00:12:09 · 23299 阅读 · 4 评论 -
Linux下Socket客户端服务器通信
Linux/Unix系统一切都是文件Linux系统中,存在一个虚拟文件系统VFS,把一切实体视为文件,包括普通文件、音视频、输入输出设备等。这样,操作系统可以可以提供统一的接口来操作任何实体。每个“文件”创建后,都有一个文件描述符(File Describer),文件描述符是一个正整数,操作系统通过文件描述符对有关文件进行操作。一般来说,每次调用创建文件的函数,都会返回一个FD,若果创建失败,则...原创 2018-12-18 11:33:47 · 842 阅读 · 0 评论 -
Linux下TCP循环接收数据的方式
简介服务器调用accept与客户端建立连接,连接建立成功后,会返回一个fd,表示这条了连接的文件描述符。之后调用recv函数接受连接的信息。根据recv函数的原型,需要服务器程序有一个接收缓冲区,实际情况可能缓冲区长度不够,需要多次接收。这时候需要调用while循环接收代码实例非阻塞方式,一次性接受完成后就退出#include &amp;amp;lt;stdio.h&amp;amp;gt;#include &amp;amp;lt;st...原创 2018-12-27 19:43:45 · 2810 阅读 · 0 评论 -
深入理解Linux/Unix文件描述符和epoll
参考资料https://medium.com/@copyconstruct/the-method-to-epolls-madness-d9d2d6378642http://man7.org/linux/man-pages/man7/epoll.7.html原创 2018-12-23 23:13:34 · 2410 阅读 · 1 评论 -
Linux生成子进程函数fork()
#include &amp;amp;lt;sys/types.h&amp;amp;gt;#include &amp;amp;lt;stdio.h&amp;amp;gt;#include &amp;amp;lt;unistd.h&amp;amp;gt;#include &amp;amp;lt;stdlib.h&amp;amp;gt;#include &amp;原创 2018-12-26 15:21:13 · 375 阅读 · 0 评论 -
Linux系统非阻塞I/O select、poll和epoll非常好的两篇文章
大佬写的两篇博文,读懂了就算彻底了解Linux基本的I/O了https://medium.com/@copyconstruct/nonblocking-i-o-99948ad7c957https://medium.com/@copyconstruct/the-method-to-epolls-madness-d9d2d6378642...转载 2018-12-20 15:50:54 · 246 阅读 · 0 评论 -
Linux系统下poll的使用方式
简介原创 2018-12-20 12:07:22 · 5125 阅读 · 0 评论 -
理解Unix/Linux系统中的文件描述符
文件描述符是针对Unix/Linux的每个进程而言的,每个进程都维护了一个文件指针表,指针指向操作系统的文件。这里的文件是指的Unix/Linux系统所说的文件,Unix/Linux下一切皆文件。文件描述符相当于一个文件指针表的下标,进程通过下标指针进行间接寻址,从而在操作系统的内核中寻找自己的资源。对于任意进程,默认的文件0、1、2分别表示标准输入、标准输出、标准错误。因此,对于进程来说,拿到...原创 2018-12-19 11:05:47 · 757 阅读 · 0 评论 -
Linux的errno
erron是一个错误码,系统调用出错的时候,会设置一个错误码。因为C语言没有异常处理机制,所以要依靠错误码进行异常情况的处理。如果系统调用出错(一般是调用函数返回-1的时候)errno会被设置为有关的标记,系统调用成功可以重新设置设置该编码。errno永远不会被系统调用或者lib库函数设置为0。errno是一个左值、可更改的、不能被显式声明的整型。是线程私有的,一个线程中的errno被改变不会...原创 2018-12-25 14:35:59 · 529 阅读 · 0 评论 -
Linux的dup与dup2函数
dup函数函数原型:int dup(int oldfd);作用:复制oldfd,返回新的文件描述符,这两个文件描述符执行相同的系统资源,而且新的文件描述符是操作系统给进程分配没有用到的数字最小的那个。注意:这个复制操作,不会复制有关的文件描述符标志,比如说CLOSE_ONEXEC等。代码实例:#include <errno.h>#include <sys/sta...原创 2018-12-25 14:51:57 · 276 阅读 · 0 评论 -
Linux使用SIGALARM信号的定时器
基本的alarm()函数使用方式alarm函数的定义:#include &amp;amp;amp;lt;unistd.h&amp;amp;amp;gt;unsigned int alarm(unsigned int seconds);该函数精确到秒级别,如果失败返回-1下面给出一个一秒的定时器,每隔一秒执行一次,自动设置。#include &amp;amp;amp;lt;signal.h&amp;amp;amp;gt;#incl原创 2019-01-18 09:59:48 · 3607 阅读 · 0 评论 -
Linux的管道
管道的基本概念pipe函数函数简介:单向的管道函数,传入一个整型数组(比如pipefd[2]),那么pipefd[1]表示写入端,pipefd[0]表示输出端。写入端写入的数据会被内核缓存,直到读出端读取所有的数据。成功返回0,失败返回-1,同时设定错误码。代码实例:代码中的一个进程创建了一个管道,之后fork出一个子进程。因为子进程会复制出父进程相同的文件描述符,所以需要关闭不用的描述...原创 2019-01-03 10:01:09 · 701 阅读 · 0 评论 -
Linux使用socket选项的定时器
socket选项SO_RCVTIMEO和SO_SNDTIMEO这个选项是专门针对socket系列的函数的,函数在下图中说明了。如果超时,就设置错误码,之后在流程中根据错误码判断是否超时。先给出超时的错误码:直接给出代码实例:#include <stdio.h>#include <sys/socket.h>#include <netinet/in.h>...原创 2019-01-17 20:53:58 · 765 阅读 · 0 评论 -
关于Linux的close函数的注意点
close的作用是关闭进程的文件描述符,即一个进程的文件描述符被close后,就不会指向内核的资源了。但是,需要注意的是,内核中的资源不会被立刻释放掉,假设有一个或多个进程的多个文件文件描述符指向同一个内核的资源,那么只有当最后一个文件描述符被close时,内核的资源才会被释放。...原创 2019-01-02 20:13:04 · 4465 阅读 · 0 评论 -
epoll关于ET、LT模式和socket非阻塞模式的几个总结
epoll的ET和LT模式LT水平触发是默认的模式,只要缓冲区有消息就会触发,如果这次事件没有被处理,那么下一次调用epoll_wait的时候,事件仍然会被触发;ET边沿触发只会在第一次有消息的时候触发,之后再次调用epoll_wait的时候,事件不会被再次触发了。Linux的epoll默认是LT模式。下面这一段来自于:https://blog.youkuaiyun.com/liuxuejiang158b...原创 2019-01-02 17:42:45 · 2359 阅读 · 0 评论 -
Linux的高效传输函数sendfile
参考手册:http://man7.org/linux/man-pages/man2/sendfile.2.html函数原型:#include &lt;sys/sendfile.h&gt;ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);out_fd是需要输出数据的fd;in_fd是需要获取数据的fd;...原创 2018-12-25 20:41:16 · 599 阅读 · 0 评论 -
Linux的iovec、readv和writev
iovecstruct iovec { void *iov_base; /* Starting address */ size_t iov_len; /* Number of bytes to transfer */};用于快速读取数据的一个字节块,指出首地址和字节块的长度即可。readv 和 writevssize_t readv(int fd, co...原创 2018-12-25 20:09:57 · 2243 阅读 · 0 评论