![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
unixc
__xa__
.
展开
-
eventfd
eventfd : 一个计数器,类似信号量;eventfd 一般用于多线程,多进程,epoll返回一个fd , 可读写;write函数用于给计数器累加数值, 例如: // 计数器初始化 : 0 int _eventfd = eventfd(0,EFD_CLOEXEC); uint64_t t =2;// 写入一个2, 则此时 计数器+= 2 ...原创 2019-11-18 01:23:51 · 478 阅读 · 0 评论 -
epoll Reactor 与 iocp 模型
epoll reactor : 能收了告知我 !iocp : 最多给我收wsabuf.len个字节, 收完告诉我!原创 2019-11-06 23:25:01 · 255 阅读 · 0 评论 -
c++ atomic 替换锁
有些文不对题了;最近搞线程池并发过程中突然想起来用 原子类型 来替换一些mutex, rwlock, cond这些东西;比如一个reactor 的epoll+线程池[ 例如4个 ], 在发送数据时为了保证tcp socket的数据顺序,必须加锁处理 [这种模型不容易控制, 实际工程中别用, 对于 socket 还是有一个线程来处理最简单也避免竞争问题].然后我发现了个好东西;...原创 2019-10-31 01:04:17 · 902 阅读 · 0 评论 -
线程安全 可重入
昨天有人问可重入和线程安全, 实际是混在一起淘浆糊了;这2个是完全不同的概念;可重入函数只有在signal下会发生, 比如一个函数在执行时被中断, 在中断处理函数中又一次被调用,这2次(每次)调用都能产生正确的结果,那就个可重入函数;看一个不可重入的例子:void sig_handler(int sig){ ... gethostbyname("www...原创 2019-07-08 03:42:35 · 938 阅读 · 0 评论 -
共享内存信号量
这文章 不知怎么了被仍进回收站了;除了用shm_open来mmap一块共享内存用普通文件也可:#include "util.h"#include <signal.h>#include <sys/mman.h>#include <semaphore.h>struct _shareobj{ sem_t mutex; int c...原创 2019-07-07 19:56:34 · 642 阅读 · 0 评论 -
多线程中对同一socket调用send/sendto
群里问多线程环境中对一个socket进行send 可以不可以;答:这个问题不是多线程问题 , 是TCP / UDP 的问题;如果是tcp ,这是个错误的设计,如果你无视数据顺序,那可以 ;如果是udp可以;TCP:在win32上,我没有找到send是否线程安全, 但找到了WSASend并不是线程安全的.因此假设send也不是线程安全的,仅仅假设;在posi...原创 2019-06-14 02:41:28 · 4758 阅读 · 1 评论 -
recvmsg udp获取接口信息IP_PKTINFO
udp 可以使用recvfrom 获取客户ip/port . 无法获取本机接口信息。只能使用recvmsg中的辅助数据来实现;recvmsg 中需要使用到一个结构struct iovec { /* Scatter/gather array items */ void *iov_base; ...原创 2019-03-14 01:46:51 · 3384 阅读 · 0 评论 -
在io复用中把监听套接字设为非阻塞
往往在select 或 epoll 中把 listen_socket 设置为非阻塞 O_NONBLOCK原因是出在 accept 上, 比如有这么一个客户端 : RST客户端当这个select或epoll 的服务器非常繁忙时, 有这么一个一连接就断开的客户端,此时 select 返回, 但还没执行到accept , 客户端就断开了, 然后执行到accept ,然后将一直阻塞一直阻塞...原创 2018-12-26 01:51:54 · 500 阅读 · 0 评论 -
epoll select的限制 条件触发 边缘触发
结论: epoll 要优于 select ,纯粹个人测试结果. 编程模型基本一致题外话:在io复用中把监听套接字设为非阻塞EPOLL描述以及EPOLLOUT处理EPOLLOUT详细例子下面代码中的epoll是最简单的实现, 一般情况都会自定义结构体赋值给 event.data.ptr,同时注意如果在使用边缘(ET)触发时给监听socket设置EPOLLET ,...原创 2018-12-26 12:39:47 · 622 阅读 · 0 评论 -
标准io 与 shutdown 半关闭
把文件描述符转标准io FILE 时 (例如: FILE readfp = fdopen(fd,"r") )如果需要半关闭, 不能使用fclose ,fclose 将直接关闭(close)套接字还是需要shutdown 来帮忙 (例如 shutdown(fileno(readfp),SHUT_WR) ) ,先把 FILE* 转描述符,再调用shutdown;代码:serv.c ...原创 2018-12-25 14:54:41 · 152 阅读 · 0 评论 -
sigwaitinfo
群里问 , 用信号处理函数还需要考虑可重入问题 , 各种中断调用, 有没有简单的方法;sigwaitinfo(sigset_t * set , siginfo_t * info) ;阻塞函数, 用来同步化的解决信号问题; 一旦待检测的 sigset_t * set 中有任一信号发生(pending) 即返回此信号,由于他检测的是pending信号, 话外之意就是你应该使用sigpro...原创 2019-07-08 23:50:48 · 2559 阅读 · 0 评论 -
pthread_sigmask
给群里的. apue和man里都有的; 对于线程信号,你应该忘记signal / sigaction ,他们只为单进程单线程设计pthread_sigmask 跟 sigprocmask 类似;sigprocmask 只能用于单进程单线程; fork的子进程拥有一份屏蔽信号拷贝;pthread_sigmask 用于多线程 ; 新线程拥有一份pthread_create那个线程的屏蔽信号...原创 2019-07-09 03:04:28 · 11084 阅读 · 4 评论 -
fork 线程与锁
给群里的;群里的人问, 多线程下调用fork , 但子进程没办法执行下去了,原因是子进程中也访问了同一把锁;fork的子进程将继承父进程锁的状态 , 如果fork时此锁已经被锁住了;一个模拟的例子:#include "util.h"#include <signal.h>#include <sys/mman.h>#include <semapho...原创 2019-07-09 05:02:44 · 536 阅读 · 0 评论 -
边缘模式EPOLLET EPOLLOUT简单例子
给群里写的,简单的EPOLLET 例子:EPOLLOUT详细说明下面2个服务器例子 ,一个没有处理EPOLLOUT, 另一个处理了;第一个例子只用来展示EPOLLET 的特点第2个例子是一个echo服务器, 处理了EPOLLOUT,如果要看EPOLLOUT的直接往下拉到第个例子, 主要还是看 errno == EAGAIN 这些地方在ET模式下:对于EPOLLIN...原创 2019-07-01 20:17:43 · 1758 阅读 · 0 评论 -
EPOLLOUT例子 EPOLLOUT触发条件
下面的代码都在ET下工作群里小伙伴没搞懂EPOLLOUT 再写2个例子; 2个例子都是回声服务器代码;关于EPOLLET的基础 , 以及EPOLLIN|EPOLLOUT|EPOLLET 一起注册的例子:EPOLLET简单例子下面2个例子都是关于EPOLLOUT,第一个例子利用EPOLL_CTL_MOD来触发EPOLLOUT,这种方式不太好,需要利用一次系统调用epoll_w...原创 2019-07-05 03:01:43 · 7581 阅读 · 1 评论 -
epoll的http服务器
一个简易的http服务器 , linux下可直接运行代码里没有处理EPOLLOUT事件,需要处理的参考:EPOLLOUT触发条件代码可配合线程池使用 :线程池代码基于EPOLLOUT例子 EPOLLOUT触发条件第2个例子有很多细节上的东西都没处理, 只是一个简单的例子,下面代码中没有注释, 上面连接中的帖子里都有注释;例子只用firefox跑过;ser...原创 2019-07-11 02:28:05 · 214 阅读 · 0 评论 -
EPOLL IOCP OVERLAPPED NONBLOCK的一些说明
最简单的多线程 , 多进程最简单的多进程/多线程服务器代码都是用 一个线程 / 一个进程 来接受/发送数据 , 资源消耗太大,不合算; 相当于一对一 [ 一个老师管理一个学生的样子 ];因此有了 select / poll / epoll / iocp 模型 .select / poll 把多个socket交给一个数组来管理 ,epoll 把每个个socket 所关联的事件统一...原创 2019-07-07 04:07:30 · 322 阅读 · 0 评论 -
一个例子说明volatile
之前一个例子 :另人厌烦的线程安全单例以及不要使用双检测说到了volatile ,volatile本身跟线程没关系, 他只做了一件事:每次读取此变量时,都到内存中去读, 让编译器别优化.gcc -O 进行优化后, 自动变量(int a) 一般情况下都可能被存放在寄存器中;下面代码用回滚操作来说明 volatile 的作用:#include "util.h"#include ...原创 2019-07-07 14:27:00 · 189 阅读 · 0 评论 -
广播
广播基本与写udp代码一致;唯一需要加的代码在发送方:DWORD bBoard = 1; 是否开启广播setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bBoard, sizeof(bBoard));其余的代码与udp一样sender.c WSADATA data; WSAStartup(MAKEWORD...原创 2018-12-23 20:40:50 · 89 阅读 · 0 评论 -
多播
多播基于udp,让路由器复制数据包传递基本和udp 程序一样不同的地方:对于发送者重要的 ,1 发送数据不再直接发送到对端,而是发送到多播地址, 但端口还是对端的端口(否则对端套接字无法接受到数据), 这样通过路由器复制再转发, 对端recvfrom 的ip 将是路由器2 多播ttl (默认1, 还是修改一下保险一些); send_addr.sin_addr...原创 2018-12-23 04:13:06 · 187 阅读 · 0 评论 -
posix semaphore 生产消费情况测试
有名信号量: 文件在 /dev/shm单消费单生产 的情况. 把sem_open 改为 sem_init 就是基于内存的信号量#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <sys/stat.h>#include <semaphore.h...原创 2018-12-01 02:05:48 · 153 阅读 · 0 评论 -
posix cond 条件变量
唯一需要注意的是 pthread_cond_wait;首先 条件变量本身需要与一个 mutex 关联. 原因是 cond 需要由 mutex 保护当执行到 pthread_cond_wait 将原子的执行2个操作;1. 将mutex 解锁2. 将线程睡眠直到pthread_cond_signal 唤醒, pthread_cond_wait将在返回前锁住mutex另外 ...原创 2018-11-30 00:21:22 · 139 阅读 · 0 评论 -
posix mutex
#include <pthread.h>#include <stdio.h>#include <stdlib.h>#define MAXTHREADS 50#define MAXITEMS 8192struct{ pthread_mutex_t mutex; int buff[MAXITEMS]; int nput...原创 2018-11-29 22:15:50 · 288 阅读 · 0 评论 -
SystemV 消息队列
SystemV 消息队列:命令: ipcs -q / ipcsmsgget : 获取或创建一个消息队列msgsnd : 发送一个消息.可自定义一个结构: struct msg{ long type; char buf[123];} 首位必须是 type 发送的长度是减去消息类型的长度: sizeof(struct msg) - sizeof(lo...原创 2018-11-26 17:33:10 · 631 阅读 · 0 评论 -
SystemV 信号量 以及 SEM_UNDO 说明
SysV 信号量集 : 一个信号量数组; 命令 ipcs - s 查看//这个联合体 有些linux系统中没定义. 其实可用可不用 union semun { int val; /* Value for SETVAL */ struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET *...原创 2018-11-29 13:39:00 · 764 阅读 · 0 评论 -
SystemV Posix 共享内存
SystemV:用到的函数:ftok : 生成一个32位整数, shmget第一个参数需要用到. 相同的key,返回相同的shmidshmget : 用于创建或获取一个共享内存。返回一个id用于标识这块IPC对象;shmat: 把共享内存映射到进程地址空间.shmdt : 断开映射.与shmat,作用相反;shmctl : 获取共享内存属性(大小,权限,创建时间,pi...原创 2018-11-24 14:58:52 · 273 阅读 · 0 评论 -
sigprocmask sigaction
sigprocmask: 用于随时添加信号屏蔽字 ;sigaction : signal增强版本, 当处理信号时, 可以随意添加信号屏蔽字 sigset_t newmask,oldmask,pendmask; signal(SIGINT,sig_handler); sigemptyset(&newmask); sigaddset(&...原创 2018-11-23 13:00:28 · 528 阅读 · 0 评论 -
fork vfork
fork :int gval = 1;int main(int argc , char ** argv , char ** env){ int localvar = 1; pid_t child = 0; if((child = fork()) == 0){ ++gval; ++localvar; exit(0...原创 2018-11-20 15:26:28 · 104 阅读 · 0 评论 -
多个缓冲区
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <semaphore.h>#include <pthread.h>#includ原创 2018-12-01 03:04:19 · 612 阅读 · 0 评论 -
确定字节序
小端: 左->右大端: 右->左 union{ short n; char c[sizeof(short)]; }un; un.n = 0x0102; if(un.c[0] == 1 && un.c[1] == 2) puts("big"); else if(un.c[0] = 2 &...原创 2018-12-03 17:28:16 · 106 阅读 · 0 评论 -
实现类似nslookup
主要就一个函数 gethostbyname #include "util.h"#include <netdb.h>extern int h_errno;int main(int argc, char**argv){ if(argc !=2 ){ puts("plz input www.xxx.com"); return...原创 2018-12-13 21:01:06 · 632 阅读 · 0 评论 -
获取外出接口
getsockname : 获取本机socket信息 ( 源ip/port) void get_out_int(char * ipaddr,unsigned short port){ //windows 初始化一下; //WSADATA wsadata; // WSAStartup(MAKEWORD(2, 2), &wsadata); SOCKET soc...原创 2018-12-23 02:46:09 · 303 阅读 · 0 评论 -
readv writev 简介 一次读写多个缓冲区
一个小例子说明函数使用:结构说明:struct iovec { void * iov_base //缓冲区地址 size_t iov_len //缓冲区输入/输出长度}#include "util.h"#include <sys/uio.h>int main(int argc , char **argv){ struct io...原创 2018-12-22 17:29:39 · 525 阅读 · 0 评论 -
一个例子说明 MSG_OOB MSG_PEEK MSG_DONTWAIT
MSG_OOB : 仅仅是通过tcp头的urgent 模式传送的, 且只会读取一个字节作为oob数据 例如:send(sockfd,"1234",strlen("1234"),MSG_OOB); 只有最后一个字节:4 将被当作oob数据 ,其他数...原创 2018-12-22 17:29:29 · 1370 阅读 · 0 评论 -
用于消耗服务器资源的rst工具
以下代码可自行修改成 用于大量消耗服务器资源的工具.主要SO_LINGER 选项. 作用于close时, 直接发送 rst; 例子:#include "util.h"int main(int argc, char**argv){ if(argc != 3){ puts("ip port"); return 0; ...原创 2018-12-22 17:29:09 · 285 阅读 · 0 评论 -
一些套接字辅助
略#define SA struct sockaddrssize_t readn(int fd , void *ptr, size_t n){ size_t left = n; char * p = (char *)ptr; int nread = 0; while (left > 0){ if((nread = read(fd...原创 2018-12-22 17:28:55 · 124 阅读 · 0 评论 -
udp connect
在udp 上使用connect 的情况:1. 需要获取icmp 的错误信息.2.如果需要向同一个ip地址多次 sendto , 用以减少不断的连接,断开.提高性能注意: udp 的connect 只记录(注册)对端的套接字结构(ip,port) , 并不会像tcp 进行3次握手.所以无法第一时间获取连接错误; 这种称为有连接的udp套接字 也只能 发送/接受 con...原创 2018-12-22 17:29:57 · 313 阅读 · 0 评论 -
select 服务器 客户端 缩水版本
tcpserver.cint main(int argc, char**argv){ int listenfd = socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in serv_addr, client_addr; socklen_t client_len = sizeof(client_addr); ...原创 2018-12-22 17:28:04 · 231 阅读 · 0 评论 -
Time-wait SO_REUSEADDR
哪端首先 close(socket) -> FIN 传递后. 经过4次握手后即进入 time-wait time-wait 会等待一段时间. 此时使用 bind 将失败 , 可使用netstat -a 查看状态对于服务器来说, 可使用 SO_REUSEADDR int sockfd = socket(PF_INET,SOCK_STREAM,0); in...原创 2018-12-13 21:39:43 · 153 阅读 · 0 评论 -
测试mmap
mmap 参数 :addr : 依据边界颗粒度 (提升到某个页面的整数倍)length , offset : 总是某个页面的整数倍 页面大小 : sysconf(_SC_PAGE_SIZE); 一般 4096 或 8192基础:如果映射大小超过了文件大小 , 则在映射区写入的字节将被丢弃以下例子 可使用 od -b -A d 1.dat 来查看写入情况 int...原创 2018-11-09 14:50:38 · 476 阅读 · 0 评论