自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 收藏
  • 关注

原创 linux网络编程 epoll水平触发、边沿触发、反应堆模型、线程池思想

打开文件上限的设置可修改配置文件: etc/security/limits.conf 水平、边沿触发:若客户端发送1000B数据,服务器一次只读500B。在水平触发的模式下,服务器会再调用一次epoll_wait将剩余的数据读取。而在边沿触发模式下,服务器只会调用第一次epoll_wait,读取第一次的500B数据,剩余的数据会保留在sock可读缓存区内。边沿触发:对同一次事件的epoll_wait,即使事件没处理干净,也只会有一次返回值 水平触发:对同一次时间的epoll_wait,即使事件

2022-03-28 16:24:12 1497

原创 linux网络编程 多路IO转接服务器 epoll

1 /* 2 头文件:#include<sys/epoll.h> 3 epoll是select/poll的进阶版,同样是内核监听客户端连接服务器请求的设置 4 5 原型: 6 创建epoll句柄 7 int epoll_create(int size); 8 size: 设置epoll的文件描述符数量 9 返回值:成功返回epoll句柄描述符;失败返回-1,设置errno 10 作用:建立红黑epoll树,返回的epoll文件描述符为所建epoll红黑...

2022-03-27 23:12:28 1160

原创 linux网络编程 多路IO转接服务器 poll

poll的使用与select使用差别:poll不需要自定义一个存放文件描述符的数组 poll不需要自定义保存设置监听的集合特点:相比select,可设置的监听个数突破1024 监听、返回集合 搜索范围小 1 /* 2 头文件#include <poll.h> 3 4 原型:int poll(struct pollfd fds[], nfds_t nfds, int timeout); 5 struct pollfd{ 6 int fd;

2022-03-27 23:03:48 635

原创 linux网络编程 多路IO转接服务器 select

多路IO转接服务器:不由应用程序自己监听客户端连接,取而代之由内核替应用程序监听文件select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024 超过限制值后,select采用轮询模型,会降低服务器响应效率 1 /* 2 头文件:#include <sys/select.h> 3 原型: 4 int select(int nfds, fd_set *restrict readfds,fd_set *restrict writefds, fd_set *re

2022-03-26 22:17:14 307

原创 linux网络编程 端口复用与半关闭shutdown

1 /** 2 头文件:#include <sys/socket.h> 3 原型:int shutdown(int sockfd, int how); 4 5 sockfd:需要关闭的sock描述符 6 how:允许为shutdown操作选择一下几种方式 7 SHUT_RD(0): 关闭sock上的读功能,套接字不再接受数据,任何当前在套接字缓冲区上的数据将被删除 8 SHUT_WR(1): 关闭sock上的写功...

2022-03-26 21:35:25 240

原创 linux网络编程 多进程服务器

服务器设置为接受所有ip地址的请求,不同ip地址可以同一时间访问服务器。服务器通过fork,让每一个连接的客户端对应一个子进程为客户端服务,在客户端下线时有服务器父进程循环回收死去的子进程。服务器: 1 #include<stdlib.h> 2 #include<sys/socket.h> 3 #include<stdio.h> 4 #include<arpa/inet.h> 5 #include<unistd.h>

2022-03-26 19:35:40 300

原创 linux网络编程 客户端、服务器实现

服务器: 1 #include<sys/socket.h> 2 #include<stdio.h> 3 #include<arpa/inet.h> 4 #include<unistd.h> 5 #include<ctype.h> 6 #include<strings.h>//bzero 7 8 #define server_addr "127.0.0.1" 9 #define server_po

2022-03-26 17:36:51 491

原创 linux网络编程 ip地址转换函数

1 /* 2 头文件:#include<arpa/inet.h> 3 4 网络ip地址转化为网络字节序 5 int inet_pton(int af, const char *restrict src, void *restrict dst); 6 7 网络字节序转化为网络ip地址 8 const char *inet_ntop(int af, const void *restrict src,char *restrict dst, socklen_t ...

2022-03-25 21:22:24 985 1

原创 linux网络编程 socket函数

1 /* 2 头文件:#include<sys/types.h> #include<sys/socket.h> 3 原型:int socket(int domain,int type,int protocol); 4 domain: 5 AF_INET :表示使用TCP或UDP来传输,用IPv4地址 6 AF_INET6:表示使用TCP或UDP来传输,用IPv6地址 7 AF_UNIX :本地协议,在Lin...

2022-03-25 20:04:45 1296

原创 linux系统编程 进程间文件锁

1 /* 2 头文件:#include<fcnt.h> #include<unistd.h> 3 原型:int fcntl(int fildes, int cmd, ...); 4 int fcntl(int fildes,int cmd,struct flock *flags); 5 fildes:文件描述符 6 cmd: 7 F_SETLK: 设置文件锁(尝试获取,不阻塞) 8 F_SETLKW: 设置文件锁(阻塞等待...

2022-03-25 16:08:58 587

原创 linux系统编程 进程间互斥锁

1 /* 2 头文件:#include<pthread.h> 3 4 获取定义互斥锁的属性: 5 int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict attr,int *restrict pshared); 6 7 设置互斥锁的属性: 8 int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr,int pshar...

2022-03-25 15:12:46 1183

原创 linux系统编程 信号量

信号量是进化版的互斥锁:由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一个对象的一部分数据进行共享,使用互斥锁是没有办法实现的,只能对整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降,线程从并发执行,变成了串行执行。与直接使用单进程无异。信号量,是相对折中的一种处理方式,既能保证同步,数据不混乱,又能提高线程并发。...

2022-03-25 14:33:03 178

原创 linux系统编程 条件变量与互斥锁的使用

32 #include<stdio.h> 33 #include<pthread.h> 34 #include<unistd.h> 35 #include<stdlib.h> 36 #include<string.h> 37 pthread_mutex_t mutex; 38 pthread_cond_t condt; 39 pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 40 ..

2022-03-25 13:35:12 441

原创 linux系统编程 条件变量

条件变量不是锁。但他可以造成线程阻塞,通常与互斥锁配合使用,给多线程一个会合的场所。 1 /* 2 头文件:#include<pthread.h> 3 4 初始化条件变量: 5 动态初始化: 6 int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr); 7 静态初始化: 8 pthread_cond_t cond = PTHREA

2022-03-25 00:08:54 407

原创 linux系统编程 读写锁

特点:与互斥锁类似,但读写锁允许更高的并行性。(写时独占,读时共享,写锁优先级高)读写锁状态:读模式下加锁 写模式下加锁 不加锁 1 /*头文件:#include<pthread.h> 2 3 初始化读写锁: 4 动态初始化: 5 int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr); 6 静态初始化: 7

2022-03-24 23:47:46 222

原创 linux系统编程 互斥锁使用

注意:使用互斥锁在访问共享资源前加锁,访问后立即解锁。锁的“粒度”越小越好(锁里的动作越少越好)死锁:线程对同一个互斥锁连续加锁两次 线程a、b各加了一个不同的锁,却不解开,而去试图加锁其他锁​ 28 #include<stdio.h> 29 #include<pthread.h> 30 #include<unistd.h> 31 #include<stdlib.h> 32 //定义全局变量:锁 33 pthread_mutex

2022-03-24 23:11:58 490

原创 linux系统编程 互斥量mutex

linux中线程在执行过程中都有可能因为cpu的资源问题而导致暂时失去执行的权利而导致某些问题。在某些线程例如使用了alarm()定时后,却应为暂时失去cpu资源而导致下一步动作没能执行pause(),回复执行的权利的时间>定时的时间,导致进程一直挂起。 如果加上锁将alarm()与pause()绑定在一起,就能避免这种问题的出现互斥锁是Linux锁机制中的一种锁,该锁的特点:同一时刻只能有一个线程持有互斥锁 互斥锁只对执行了加载互斥锁的线程具有作用 互斥锁是一把建议锁,没有强制的限制

2022-03-24 22:37:06 810

原创 linux系统编程 线程属性的设置

1 头文件:#include<pthread.h> 2 typedef struct 3 { 4 int etachstate; //分离状态 5 int schedpolicy; //调度策略 6 struct sched -param schedparam; //调度参数 7 ...

2022-03-24 18:25:46 345

原创 linux系统编程 杀死线程

pthread_cancel()函数头文件:#include<pthread.h> 原型:int pthread_cancel(pthread_t thread); 返回值:成功返回0;失败返回错误号 作用:杀死进程注意:线程杀死并不是实时的,有一定延时,需要等待线程到达某个取消点(使用了系统调用),也可用pthread_testcancel()函数设置一个取消点。 线程分离会自动释放资源,线程杀死需要回收线程才能释放资源 1 #include<stdio.h&gt

2022-03-24 17:33:19 1606

原创 linux系统编程 线程分离

pthread_detach头文件:#include(pthread.h) 原型:int pthread_detach(pthread_t thread); 返回值:成功返回0;失败返回错误号 作用:线程分离,线程主动与主控线程断开关系,线程结束后,主动释放资源也可用pthread_create()函数中参数二设置 1 #include<stdio.h> 2 #include<pthread.h> 3 #include<unistd.h>

2022-03-24 16:56:17 299

原创 linux系统编程 线程回收

pthread_join()函数头文件:#include<pthread.h> 原型:int pthread_join(pthread_t thread,void **retval); retval:获得线程调用pthread_exit的信息 返回值:成功返回0;失败返回错误号 作用:阻塞等待线程并且回收线程资源(PCB)回收单个线程: 1 #include<stdio.h> 2 #include<pthread.h> 3 #include&

2022-03-24 16:43:45 414

原创 linux系统编程 线程退出

pthread_exit()函数头文件:#include<pthread.h> 原函数:void pthread_exit(void *retval); 作用:将线程退出 retval:表示线程退出的状态,通常传NULL 1 #include<stdio.h> 2 #include<pthread.h> 3 #include<string.h> 4 #include<unistd.h> 5 void *th_read

2022-03-24 12:59:16 464

原创 linux系统编程 循环创建多个子线程

循环创建线程注意事项:线程独享栈空间 进程创建线程的时候,会把相应的栈空间的值赋给线程,创建完成后线程独享栈内的值 在创建线程时,若连续多次创建线程,并且要将特定参数传给线程时,可能会出现地址上的旧值还未成功赋予,地址上的旧值就被新值代替。 所以在传递参数时,应用传值代替传参数(不推荐),或者在创建线程时等待一段时间,确保值被成功赋予 1 #include<stdio.h> 2 #include<pthread.h> 3 #include<string.

2022-03-24 12:04:30 668 3

原创 linux系统 线程控制函数

pthread_self()函数头文件:#include<pthread.h> 原型:pthread_t pthread_self(void); 返回值:永远不会失败并且返回调用该函数的线程ID pthread_t类型:在Linux下为无符号整数(%lu),其他系统中可能是结构体实现 作用:获取线程IDpthread_create()函数头文件:#include<pthread.h> 原型:int pthread_create(pthread_t *thread,

2022-03-23 22:38:55 221

原创 linux系统编程 线程

线程的概念:LWP:light weight process 轻量级的进程,本质仍是进程(linux环境下) 进程:独立地址空间,拥有PCB 线程:无独立地址空间,拥有PCB 区别:在于是否共享地址空间。 共享(线程) 私有(进程)linux下: 线程:最小的执行单位 进程:最小分配资源单位,可以看成只有一个线程的进程linux内核线程实现原理:轻量级进程,也有PCB,创建线程使用的底层函数和进程一样,都是clone 从内核量看...

2022-03-23 21:43:20 160

原创 linux系统编程 守护进程

Daemon(精灵)进程,是linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。linux后台的一些服务进程,没有控制终端,不能直接和用户交互,不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如预读入缓输出机制的实现:ftp服务器、nfs服务器等。chdir()函数头文件 #include<unistd.h> |原型:int chdir(const char *path);umask()函数头文件 #inc

2022-03-23 18:46:54 343

原创 linux系统编程 会话

绘画创建注意事项:调用进程不能是进程组组长,该进程变成新会话首进程 该进程成为一个新进程组的组长进程 需要有root权限 新绘画丢弃原有的控制终端,该会话没有控制终端 该调用进程是组长进程,则出错返回 建立新会话时,先调用fork,父进程终止,子进程调用setsidgetsid函数获取进程所属的会话ID原型:pid_t getsid(pid_t pid);。返回值:成功返回调用进程的会话ID;失败返回-1,设置errnopid为0表示察看当前进程session IDsetsi

2022-03-23 17:55:14 138

原创 linux系统编程 进程组

父进程创建子进程的时候,默认子进程与父进程属于同一进程组,进程组ID==第一个进程ID(组长进程)。所以,组长进程标识:其进程组ID==其进程ID组长进程可以创建一个进程组,创建该进程组中的i进程,然后终止,只要进程组中有一个进程存在,进程就存在,与组长进程是否终止无关。进程组生存期:进程组创建的最后一个进程离开(终止或转移到另一个进程组)。一个进程可以为自己或子进程设置进程组ID进程组操作函数头文件:#include<unistd.h>getpgrp函数:获得当前进

2022-03-23 17:22:38 246

原创 linux系统编程 中断系统调用

系统调用可分为两类:慢速系统调用和其他系统调用1.慢速系统调用:可能会使进程永远阻塞的一类。如read、wirte、pause、wait....2.其他系统调用:getpid、getppid、fork...可以设置sa_flags参数来设置被信号中断后系统调用是否重启。SA_INTERRURT不重启、SA_RESTART重启。sa_flags参数设置为SA_NODEFER,将信号捕捉函数设为可重入函数。...

2022-03-23 16:59:33 184

原创 linux系统编程 信号传参

发送信号传参sigqueue()头文件 #include<signal.h>原型: int sigqueue(pid_t pid,const union sigval value);union sigval{int sival_int;void *sival_prt;};返回值: 成功返回0;失败返回-1,设置errno作用:向指定进程发送指定信号的同时,携带数据。但传地址需要注意,不同进程之间的虚拟地址空间各自独立,虚拟地址传递给另一个进程没有实际意义。...

2022-03-23 16:47:45 311

原创 linux系统 可/不可重入函数、SIGCHILD

一个函数在被调用执行期间(尚未调用结束),由于某种时序又被重复调用,称之为“重入”。根据函数实现的方法可分为“可重入函数”和“不可重入函数”两种。注意事项1.定义可重入函数,函数内不能含有全局变量及static变量,不能使用malloc、free2.信号捕捉函数应设计为可重入函数3.信号处理程序可以调用的可重入函数可参阅man 7 signal...

2022-03-23 16:28:59 280

原创 linux系统编程 全局变量的异步IO

1 #include<stdio.h> 2 #include<signal.h> 3 #include<unistd.h> 4 #include<stdlib.h> 5 6 int n = 0; 7 int flag = 1; 8 //SIGUSR1 SIGUSR2是系统定义给用户使用的信号 9 void do_sig_child(int )//子进程捕捉函数 10 { 11 n+=2; 12 ...

2022-03-23 16:18:08 117

原创 linux系统编程 时序竞态

由上篇alarm()与pause()函数实现的简单sleep()函数,我们可以发现一个问题。当进程执行完alarm()函数之后,还没来得及执行pause()函数,就失去cpu(内核去执行其他程序)。再alarm()计时结束后,本程序才得到cpu,执行pause()函数。这时会发现本进程永远都会在pause()函数执行的挂起状态,退不出来。解决办法:可以通过设置屏蔽SIGALRM,将执行挂起状态与解除屏蔽绑定在一起(原子操作)。sigsuspend()函数:执行期间用自己的mask覆盖阻塞信号集,

2022-03-23 11:56:49 85

原创 linux系统编程 挂起pause() 、睡眠sleep()

1 /* 2 pause()头文件 #include<unistd.h> 3 原型: int pause(void); 4 返回值:-1并设置error为EINTR 5 1.如果信号的默认处理动作是终止进程,则进程终止,pause函数没有机会返回 6 2.如果信号的默认处理动作是忽略,进程进行处于挂起状态,pause函数不返回 7 ##3.如果信号的处理动作是捕捉,则调用完信号处理函数后 8 pause返回-1,error设置为EINTR,表示被信号中...

2022-03-22 22:22:31 803

原创 linux系统编程 注册信号捕捉函数sigaction

1 /* 2 sigaction()头文件 #include<signal.h> 3 原型: int sigaction(int signum,const struct sigaction *act,struct sigaction * oldact); 4 signum: 待捕捉的信号 5 act: 处理动作,传入参数 6 oldact: 旧处理动作,传出参数 7 struct sigaction{ 8 void ...

2022-03-22 19:38:16 553

原创 linux系统编程 信号集函数的使用-打印未决信号集

1 /* 2 设置信号集并打印 3 修改阻塞信号集 4 打印未决信号集 5 */ 6 #include<stdio.h> 7 #include<signal.h> 8 #include<unistd.h> 9 void print(sigset_t *ped) 10 { 11 int i; 12 for(i=1;i<32;i++){ 13 if(sigism...

2022-03-22 18:12:56 143

原创 linux系统编程 信号集操作函数

1 /* 2 信号集设定 3 头文件 #include<signal.h> 4 原型: 5 sigset_t set; //typedef unsigned long sigset_t; 定义信号集合 6 int sigemptyset(sigset_t *set); 将某个信号集合清0 成功返回0,失败返回-1 7 int sigfillset(sigset_t *set); 将某个信号集合清1 ...

2022-03-22 17:18:40 56

原创 linux系统编程 signal—signal()注册信号捕捉处理函数

setitimer()函数补充:it_value设置的时间是第一次发送信号到需要等待的时间;it_interval设置的时间是后续发送信号间隔的时间(调用一次setitimer函数若有设置it_interval,则持续发送信号至进程结束)signal()函数: 1 /* 2 signal()头文件 #include<signal.h> 3 原型: typedef void (*sighandler_t)(int); 4 //定义一个sighandler_t,表示指向

2022-03-22 15:29:36 1144

原创 linux系统编程 signal—setitimer()精度us、周期定时

1 /* 2 setitimer()头文件#include<sys/time.h> 3 原型: int setitimer(int which,const struct itimerval *new value,struct itimerval *old value); 4 ##设置定时器(闹钟),可代替alarm函数,精度微妙us,可以实现周期定时 5 6 which: 1.自然定时: ITIMER_REAL 计算...

2022-03-22 14:13:16 340

原创 linux系统编程 signal—alarm()时钟定时器

1 /* 2 alarm()函数头文件#include<unistd.h> 3 原型:unsigned int alarm(unsigned int seconds); 4 返回值:返回0或剩余的秒数,无失败 5 常用:取消定时器alarm(0),返回旧闹钟剩余的秒数 6 eg: 7 (定时5秒) (闹钟被重制为4秒后执行) 8 Th1: alarm(5)---经过3秒--->alarm(4)---经过4秒--->发送SIGAL...

2022-03-22 14:10:39 1615

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除