linux
蜀沐
这个作者很懒,什么都没留下…
展开
-
手写 实现线程池
1、什么是线程池?线程池如何实现?1.如何从线程池里面拿一个线程2.如何把线程返回给线程池3.线程池里面控制线程数量1、#include <stdio.h>#include <stdlib.h>#include <string.h>#include <pthread.h>#define LL_ADD(item, list) do { \ item->prev = NULL; \ item->next =原创 2021-07-30 13:28:43 · 142 阅读 · 0 评论 -
Linux网络编程之epoll反应堆模型
epollAPIepoll_create(); — int epfd = epoll(10); — epfd(句柄)struct epoll_event events;events.events = EPOLLIN;events.data.fd = lfd;epoll_ctl(); — epoll(epfd, EPOLL_CTL_ADD, lfd, &events); op: EPOLL_CTL_ADD/MOD/DEL events: EPOLLIN/OUT/原创 2021-07-04 16:09:48 · 194 阅读 · 2 评论 -
Linux网络编程之epoll函数
1、epoll API1、 epoll_create函数函数作用创建一个epoll句柄,参数size用来告诉内核监听的文件描述符的个数,跟内存大小有关。函数原型#include <sys/epoll.h>int epoll_create(int size) size:监听数目返回值:返回一个文件描述符,这个文件描述符指向一颗平衡二叉树的树根Linux内核里面是红黑树2、epoll_ctl 函数函数作用控制某个epoll监控的文件描述符上的事件:注册、原创 2021-06-21 18:04:12 · 306 阅读 · 0 评论 -
Linux网络编程之poll函数
1、poll函数详解头文件#include <poll.h>函数原型int poll(struct pollfd fds, nfds_t nfds, int timeout);fds :结构体数组的首地址struct pollfd{int fd; / 文件描述符 / short events; / 监控的事件 / short revents;/ 监控事件中满足条件返回的事件 */ }; events: POLLIN(读事件)、POLLOUT(写事件原创 2021-06-21 18:03:59 · 524 阅读 · 0 评论 -
Linux 网络编程之select函数
1、什么是I/O多路转接技术:先构造一张有关文件描述符的列表, 将要监听的文 件描述符添加到该表中然后调用一个函数,监听该表中的文件描述符,直到 这些描述符表中的一个进行I/O操作时,该函数才 返回1.该函数为阻塞函数2.函数对文件描述符的检测操作是由内核完成的在返回时,它告诉进程有多少(哪些)描述符要进行不再由应用程序自己监视客户端连接,取而代之由内核替应用程序监视文件。2、 IO多路转接 - selectselect返回的是发生I/O操作文件描述符的总数量,传出来的文件描述符表是原创 2021-06-21 13:12:31 · 285 阅读 · 0 评论 -
Linux网络编程之多线程并发服务器
思路:1、主控线程等待接受连接请求2、子线程 负责通信多线程并发服务器伪代码:typedef struct sockInfo{pthread_t id;int fd;struct sockaddr_in addr;}SockInfo;void work(void * arg){ while() { //打印客户端ip和port; read(); write(); }}int main(){ //监听 int lfd = sock原创 2021-06-21 09:40:33 · 144 阅读 · 0 评论 -
linux网络编程之多进程并发服务器
1、父进程负责等待连接请求,子进程负责和客户端通信,每次有一个连接请求,就创建一个子进程和客户端进行通信使用多进程的方式,解决服务器多连接的问题:1、共享读时共享,写时复制父子进程共享文件描述符,内存映射区2、父进程的角色?等待客户端连接,有连接,创建一个子进程 关闭用于通信的文件描述符3、子进程的角色?和客户端通信 关闭监听的文件描述符4、创建的进程的个数有限制吗一个进程最多有1024个文件描述符有限制,受硬件的限制5、子进程资源回收wait/waitpid信原创 2021-06-20 22:28:58 · 197 阅读 · 1 评论 -
linux 系统编程之信号量
信号量信号量初始化时为n,也就是说可以指定任意值-一 个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步既可以用于线程同步又可以用于进程同步主要应用函数:sem_init函数 sem_destroy函数 sem_wait函数 sem_trywait函数 sem_timedwait函数 sem_post函数以上6 个函数的返回值都是:成功返回0, 失败返回-1,同时设置errno。sem_t类型,本质仍是原创 2021-06-20 17:54:55 · 175 阅读 · 0 评论 -
Linux系统编程之条件变量
条件变量条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用主要应用函数:pthread_cond_init函数 pthread_cond_destroy函数pthread_cond_wait函数pthread_cond_timedwait函数 pthread_cond_signal函数pthread_cond_broadcast函数以上6 个函数的返回值都是:成功返回0, 失败直接返回错误号。pthread_cond_t类型 结构体类型 用于定义条件变量 :pth原创 2021-06-20 17:09:57 · 253 阅读 · 0 评论 -
Linux系统编程之读写锁
读写锁读写锁状态:一把读写锁具备三种状态:1. 读模式下加锁状态 (读锁)2. 写模式下加锁状态 (写锁)3. 不加锁状态读写锁特性:读写锁是“写模式加锁”时, 解锁前,所有对该锁加锁的线程都会被阻塞。读写锁是“读模式加锁”时, 如果线程以读模式对其加锁会成功;如果线程以写模式加锁会阻塞。读写锁是“读模式加锁”时, 既有试图以写模式加锁的线程,也有试图以读模式加锁的线程。那么读写锁会阻塞随后的读模式锁请求。优先满足写模式锁。读锁、写锁并行阻塞,写锁优先级高主要应用函数:pthrea原创 2021-06-20 16:18:58 · 433 阅读 · 0 评论 -
Linux系统编程之死锁
死锁**1. 线程试图对同一个互斥量A加锁两次。**当线程对一个互斥量加锁两次:会发生 死锁分析:线程A对一个互斥量加锁,访问结束后,又进行加锁,会发生阻塞现象,等着线程A解锁,但是线程A 进行加锁操作,一直阻塞在那里,所以发生了死锁代码如下所示:#include <iostream>#include <thread>#include <mutex>#include <unistd.h>using namespace std;int原创 2021-06-20 15:21:08 · 146 阅读 · 0 评论 -
Linux系统编程之互斥量
思想:每个线程在对****资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁互斥锁实质上是操作系统提供的一把“建议锁”(又称“协同锁”),建议程序中有多线程访问共享资源的时候使用该机制。但,并没有强制限定。主要应用函数:pthread_mutex_init函数pthread_mutex_destroy函数pthread_mutex_lock函数 :阻塞发等待pthread_mutex_trylock函数pthread_mutex_unlock函数pthread_mutex_t 类型,原创 2021-06-20 14:49:12 · 127 阅读 · 0 评论 -
linux系统编程之线程属性
1. 初始化线程属性函数原型:int pthread_attr_init(pthread_attr_t *attr); .成功:0;失败:错误号attr是传出参数typedef struct{int etachstate; //线程的分离状态int schedpolicy; //线程调度策略struct sched_param schedparam; //线程的调度参数int inheritsched; //线程的继承性int sc原创 2021-06-20 14:11:57 · 104 阅读 · 0 评论 -
linux系统编程之杀死线程
pthread_cancel函数杀死(取消)线程其作用,对应进程中 kill() 函数。函数原型:int pthread_cancel(pthread_t thread);成功:0;失败:错误号【注意】:线程的取消并不是实时的,而有一定的延时。需要等待线程到达某个取消点(检查点)。取消点:是线程检查是否被取消,并按请求进行动作的一个位置。通常是一些系统调用creat,open,pause,close,read,write… 执行命令man 7 pthreads可以查看具备这些取消原创 2021-06-20 12:34:44 · 4396 阅读 · 0 评论 -
Linux网络编程之C/S模型
1、C/S模型实现的功能:从客户端读取字符,然后将每个字符转换 成大写并返回客户端服务器端:等待连接,连接后从客户端读取数据进行处理,然后返回客户端,并且循环等待客户端连接server.c#include<stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h原创 2021-06-18 17:16:08 · 256 阅读 · 0 评论 -
linux网络编程之本地套接字通信
本地套接字伪文件即可采用TCP通信又可采用UDP通信采用TCP通信流程如下服务器端创建套接字int lfd=socket(AF_UNIX,SOCK_STREAM,0)绑定一个套接字文件struct sockaddr_un serv;serv.sun_family=AF_UNIX;strcpy(serv.sun_path,“server.socket”);------现在还不存在bind(lfd,(struct sockaddr*)&serv,len);------绑原创 2021-04-20 10:51:54 · 190 阅读 · 0 评论 -
Linux网络编程之组播通信
组播适用于局域网和广域网结构体struct ip_mreqn{//组播组的IP地址struct in_addr imr_multiaddr;//本地某一网络设备接口的IP地址struct in_addr imr_interface;int imr_ifindex;//网卡编号};struct in_addr{in_addr_t s_addr;}代码server.c#include <stdio.h>#include <unistd.h>#i原创 2021-04-19 23:29:50 · 336 阅读 · 0 评论 -
linux网络编程之UDP通信
udp面向无连接不安全保文传输服务器端:创建套接字绑定ip和端口:bind()struct sockaddr—服务器通信接受数据:recvfromssize_t recvfrom(int sockfd,voidbuf,size_t len,int flag,struct sockaddrsrc_addr,socklen_t*addrlen)fd—文件描述符buf—接受数据缓冲区len—buf的最大容量flags—0src_addr—另一端的ip和端口,传出参数ad原创 2021-04-19 22:01:25 · 133 阅读 · 0 评论 -
Linux 网络编程之UDP实现广播
广播IP:192.168.42.255利用setsockopt函数给sockfd开放广播权限server.c#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/socket.h>#include <string.h>#include <arpa/inet.h>#include <net/if.h>#define SE原创 2021-04-19 20:08:15 · 874 阅读 · 2 评论 -
Linux系统编程之一个进程最多能创建多少个线程
#include<string.h>#include<stdlib.h>#include<pthread.h>void *tfn(void *arg){ while(1) { sleep(1); }}int main(void){ pthread_t tid; int ret,count=1; for(;;) { ret=pthread_tcreate(&tid,NULL,tfn,NULL); if(ret原创 2021-04-19 10:52:26 · 167 阅读 · 0 评论 -
Linux系统编程之回收线程
pthread_join函数功能:阻塞等待线程退出,获取线程退出状态 其作用,对应进程中 waitpid() 函数nt pthread_join(pthread_t thread, void **retval);返回值:成功:0;失败:错误号参数:thread:线程ID (【注意】:不是指针);retval:存储线程结束状态。回收线程代码:#include<pthread.h>#include<stdlib.h>#include<stdio.h>原创 2021-04-15 23:24:40 · 98 阅读 · 0 评论 -
Linux系统编程之线程退出
pthread_exit函数功能:将单个线程退出void pthread_exit(void *retval);参数:retval表示线程退出状态,通常传NULL#include<stdio.h>#include<pthread.h>#include<unistd.h>#include<stdlib.h>void *thrd_func(void*arg){ prrintf("In thread;thread id=%lu,pid=%d原创 2021-04-19 11:07:06 · 155 阅读 · 0 评论 -
linux系统编程之创建线程、循环创建N个线程、线程共享全局变量
pthread_create函数功能:创建一个新线程。 其作用,对应进程中fork() 函数Int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg)返回值:成功:0; 失败:错误号 -----Linux环境下,所有线程特点,失败均直接返回错误号参数:pthread_t:当前Linux中可理解为:typedef原创 2021-04-15 22:08:26 · 516 阅读 · 0 评论 -
linux系统编程之pause函数
功能:利用pause函数和alarm函数实现sleep函数功能#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<signal.h>#include<errno.h>void catch_sigalrm(int signo){ ;}unsigned int mysleep(unsigned int seconds){ int ret; struc原创 2021-04-14 14:38:52 · 743 阅读 · 0 评论 -
Linux系统编程之signal函数
#include<signal.h>#include<stdlib.h>#include<errno.h>#include<unistd.h>#include<unistd.h>typedef void(* sighandler_t)(int);void catchsigint(int sigo){ printf("--------catch\n");}int main(void){ sighandler_t han原创 2021-04-14 10:50:00 · 136 阅读 · 0 评论 -
linux系统编程之exec函数族
exexlp函数:原型 int exexlp(const char *file,const char *arg…)返回值:只有失败才返回功能:创建一个子进程,使其执行ls -l程序#include<stdio.h>#include<unistd.h>#include<stdlib.h>int main(){ pid_t pid; pid=fork(); if(pid==-1) { perror("fork error"); e原创 2021-04-12 19:44:21 · 106 阅读 · 0 评论 -
Linux系统编程之父子进程共享
加粗样式父子进程共享父子进程的全局变量是独享的父子进程不共享全局变量#include<stdio.h>#include<stdlib.h>#include<unistd.h>int var=34;int main(){ pid_ pid; printf("xxxxxxxxx\n"); pid=fork(); if(pid==-1) { perror("fork error"); exit(1); } else原创 2021-04-12 10:36:37 · 907 阅读 · 0 评论 -
Linux系统编程之循环创建N个进程
循环创建N个进程#include<stdio.h>#include<stdlib.h>#include<unistd.h>int main(){ int i; pid_ pid; printf("xxxxxxxxx\n"); for(i=0;i<5;i++) { pid=fork(); if(pid==-1) { perror("fork error"); exit(1); } els原创 2021-04-11 22:36:10 · 704 阅读 · 0 评论 -
Linux系统编程之创建单个进程
fork函数:在当前目录下创建一个进程方式:在当前工作目录下执行一个可执行的程序fork函数fork函数返回值:返回值有两个:一个进程—>2个进程 —>各自对fork做返回1、返回子进程的pid(非负整数》0)(父进程)2、返回0 (子进程)、2、代码实录#include<stdio.h>#include<stdlib.h>#include<unistd.原创 2021-04-11 20:56:19 · 122 阅读 · 0 评论 -
Linux系统编程之dup和dup2函数
1、dup函数int dup(int oldfd);功能:复制文件描述符,新返回一个文件描述符oldfd对应的文件2、dup2函数int dup2(int oldfd,int newfd);功能: 关闭newfd对应的文件描述符,将newfd重新指向oldfd对应的文件实战:功能:在代码中执行2次printf(“hello world\n”),一次输出到world文件中,后一次输入到屏幕上涉及文件重定向#include<stdio.h>#include<unistd.h原创 2021-04-09 15:25:23 · 149 阅读 · 0 评论 -
Linux系统编程之读目录函数
功能:要求 统计一下指定目录下普通文件的个数,要求子目录递归方式一: shell命令find ./ type f|wc -l输出方式二: 代码编程#include<stdio.h>#include<unistd.h>#include<dirent.h>#include<sys/types.h>int count=0;//定义一个全局计数int DirCount(char *dirname){ //打开目录 DIR*dir原创 2021-04-09 13:55:18 · 123 阅读 · 0 评论 -
Linux系统编程之chdir函数和getcwd函数
#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>int main(){ //先切换当前目录 chdir("bbb"); int fd=open("temp",O_WRONLY|O_CREAT,0666); write(fd,"daociyiyou",10); close(fd);原创 2021-04-08 22:14:12 · 276 阅读 · 0 评论 -
Linux系统编程之软硬连接函数
1、创建硬链接函数原型int link(const charoldpath,const charnewpath);oldpath:原文件newpath:硬链接文件#include<stdio.h>#include<sys/types.h>#include<unistd.h>int main(){ link("helllo", "hello.hard"); return 0;}输出:2、软连接int symlink(const cha原创 2021-04-08 17:21:19 · 465 阅读 · 0 评论 -
Linux系统编程之access函数和truncate函数
1、access函数函数功能:判断文件是否存在或者文件的权限是否存在#include<stdio.h>#include<unistd.h>int main(int argc,char *argv[]){if(argc!=2){ pritnf("./a.out filename\n"); return -1;}if(access(argv[1],R_OK)==0) printf("%s read ok!\n"); if(access(argv[1],W_原创 2021-04-08 16:45:45 · 165 阅读 · 0 评论 -
linux系统编程之stat函数
1.查看一个文件的信息#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>int main(int argc,char*argv[]){ if(argc!=2) { printf("./a.out filename\n"); return -1; } struct stat sb; stat(argv[1],原创 2021-04-08 16:15:20 · 1373 阅读 · 0 评论 -
Linux系统编程之打开最大文件数据量
验证打开多少个文件#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>int main(){ int num=3; char filename[128]={0}; while(1) { sprintf(filename,"temp_%04d",num++);原创 2021-04-08 13:06:43 · 82 阅读 · 0 评论 -
linux系统编程之fcntl函数设置非阻塞
第一种实现非阻塞因为非阻塞时=是文件属性,所以在打开文件时设置非阻塞#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<fcntl.h>#include<string.h>#include<sys/types.h>int main(int argc,char *argv[]){ int fd=open("dev/tty",O_RDWR|O_N原创 2021-04-07 23:02:13 · 1692 阅读 · 0 评论 -
linux系统编程之lseek函数
lseek函数作用:移动文件读写计算文件大小拓展文件实现的功能1、打开一个文件,写入内容:hello word ,然后读取一下该文件,输出到屏幕#include<stdipo.h>#include<unistd.h>#include<sys/stat.h>#include<sys/types.h>#include<fcntl.h>int main(int argc,char *argv[]){ if(argc!=原创 2021-04-07 22:19:26 · 122 阅读 · 0 评论 -
linux系统编程之实现cat命令
实现cat功能:读文件,并将内容输出到标准输出 #include<stdio.h> #include<unistd.h> #include<sys/stat.h> #include<sys/type.h> #include<fcntl.h>int main(int argc,char*argv[]){ if(argc!=2) { printf("./a.out filename\n"); retu原创 2021-04-07 21:47:12 · 468 阅读 · 0 评论 -
Linux系统编程之利用SIGCHLD回收子进程
Linux系统编程之利用SIGCHLD回收子进程#include<stdio.h>#include<unistd.h>#include<sys/wait.h>#include<signal.h>void catch_sig(int num){ pid_t pid=waitpid(); if(pid>0) { printf("wait child %d ok\n",pid); }}int main(){ i原创 2021-03-11 15:20:56 · 197 阅读 · 0 评论