自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 c++11新特性

1.nullptr作用: C++11 引入了 nullptr 关键字,专门用来区分空指针、0原有问题:传统 C++ 会把 NULL、0 视为同一种东西,这取决于编译器如何定义 NULL实现:nullptr 的类型为 nullptr_t,能够隐式的转换为任何指针或成员指针的类型,也能和他们进行相等或者不等的比较。当需要使用 NULL 时候,养成直接使用 nullptr的习惯int *p1=n...

2019-11-24 21:52:34 262

原创 基于STL的演讲比赛流程管理系统

1、比赛需求分析1.1比赛规则● 学校举行一场演讲比塞,共有12个人参加。比赛共两轮,第一轮为淘汰塞,第二轮为决赛。● 每名选手都有对应的编号,如10001~10012。● 比赛方式:分组比赛,每组6个人。● 第一轮分为两个小组,整体按照选手编号进行抽签后顺序演讲。● 十个评委分别给每名选手打分,去除最高分和最低分,求的平均分为本轮选手的成绩。● 当小组演讲完后,淘汰组内排名最后的三...

2019-11-20 14:49:38 465

原创 strcasecmp函数

strcasecmp用忽略大小写比较字符串,此函数只在Linux中提供,相当于windows平台的 stricmp。返回值:当函数的两个参数在忽略大小写的情况下相等时,返回0,!返回值为1;当函数的两个参数在忽略大小写的情况下不相等时,返回负值,!返回值为0。示例代码strcasecmp.c:#include <stdio.h>int main(void){ char ...

2019-11-18 22:04:16 2333 1

原创 epoll函数

代码实现makefilesrc=$(wildcard *.c) obj=$(patsubst %.c,%.c,$(src))all:server clientserver: server.o wrap.o gcc server.o wrap.o -o...

2019-11-14 10:18:24 136

原创 poll函数

代码实现makefilesrc=$(wildcard *.c) obj=$(patsubst %.c,%.c,$(src))all:server clientserver: server.o wrap.o gcc server.o wrap.o -o...

2019-11-13 22:13:37 198

原创 多路I/O转接服务器

多路IO转接服务器也叫多任务IO服务器。该类服务器实现的主旨思想是,不再由应用程序自己监视客户端连接,取而代之由内核替应用程序监视文件。主要使用的方法有三种。select函数。poll函数。epoll函数。...

2019-11-13 22:09:56 78

原创 select函数

select函数函数原型:int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);参1: 所监听的所有文件描述符中,最大的文件描述符+1,fd4+1参2/3/4: 所监听的文件描述符“可读”事件。readfds();所监听的文件描述符“可写”...

2019-11-13 19:49:38 268

原创 多进程并发服务器实现

makefilesrc=$(wildcard *.c) obj=$(patsubst %.c,%.c,$(src))all:server clientserver: server.o wrap.o gcc server.o wrap.o -o serv...

2019-11-12 22:53:06 227

原创 linux网络编程服务端客户端-出错处理封装函数

出错处理函数头文件wrap.h#ifndef __WRAP_H_#define __WRAP_H_void perr_exit(const char *s);int Accept(int fd,struct sockaddr *sa,socklen_t *salenptr);int Bind(int fd,const struct sockaddr *sa,socklen_t sale...

2019-11-12 21:11:33 189

原创 linux网络编程客户端实现client.c

client.c#include <stdio.h>#include <unistd.h>#include <sys/socket.h>#include <stdlib.h>#include <arpa/inet.h>#include <string.h>#define SERV_IP "127.0.0.1"...

2019-11-12 15:12:45 518

原创 linux网络编程服务器端实现server.c

功能:将客户端输入的小写字符转化为大写字符。#include <stdio.h>#include <unistd.h>#include <sys/socket.h>#include <stdlib.h>#include <ctype.h>#include <arpa/inet.h>#define SERV_IP...

2019-11-12 11:59:07 326

原创 网络套接字函数

基本TCP客户端/服务器程序的套接字函数基本TCP客户端/服务器程序的套接字函数socket函数:在 Linux 下使用 <sys/socket.h> 头文件中 socket() 函数来创建套接字。原型为:int socket(int af, int type, int protocol);1.af 为地址族(Address Family),也就是 IP 地址类型,常用的有 ...

2019-11-12 10:56:25 212

原创 sockaddr数据结构

struct sockaddr很多网络编程函数诞生早于IPv4协议,那时候都使用的是sockaddr结构体,为了向前兼容,现在sockaddr退化成了(void *)的作用,传递一个地址给函数,至于这个函数是sockaddr_in还是sockaddr_in6,由地址族确定,然后函数内部再强制类型转化为所需的地址类型。...

2019-11-11 21:24:30 247

原创 网络字节序

TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。#include <arpa/inet.h>unit32_t htonl(uint32_t hostlong);unit16_t htons(unit16_t hostshort);...

2019-11-11 20:56:33 484

原创 文件锁

借助fcntl函数来实现锁机制。操作文件的进程没有获得锁时,可以打开,但无法执行read、write操作。fcntl函数:获取、设置文件访问控制属性。int fcntl(int fd,int cmd,…/* arg */);...

2019-11-11 16:16:53 81

原创 进程间互斥量

互斥量mutex进程间也可以使用互斥锁,来达到同步的目的。但应在pthread_mutex_init初始化之前,修改其属性为进程间共享,mutex的属性修改函数主要有以下几个。pthread_mutexattr_t mattr类型:用于定义mutex锁的属性pthread_mutexattr_init函数:初始化一个mutex属性对象int pthread_mutexattr_init(p...

2019-11-11 16:06:44 367

原创 信号量生产者消费者模型

示例代码sem_product_consumer.c#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <stdio.h>#include <semaphore.h>#define NUM 5int queue[NUM];//全局数组实现...

2019-11-11 11:36:14 129

原创 信号量

进化版的互斥锁(1–>N)由于互斥锁的粒度比较大,如果我们希望在多个线程sem_init函数初始化一个信号量。sem_destroy函数销毁一个信号量。sem_wait函数给信号量加锁 –sem_trywait函数尝试对信号量加锁 –sem_timedwait函数限时等待一个信号量。sem_post函数给信号量解锁 ++以上6个函数的返回值都是:成功返回0,...

2019-11-10 22:15:23 222

原创 条件变量生产者消费者模型

示例代码cond_var.c#include <stdio.h>#include <unistd.h>#include <pthread.h>#include <stdlib.h>/*链表作为共享数据,需被互斥量保护*/struct msg{ int num; struct msg *next;};struct msg *h...

2019-11-10 17:42:29 115

原创 条件变量

条件变量:条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。主要应用函数:pthread_cond_init函数xianc初始化一个条件变量。pthread_cond_destroy函数销毁一个条件变量。pthread_cond_wait函数阻塞等待一个条件变量。int pthread_cond_wait(pthread_cond_t ...

2019-11-10 14:44:38 137

原创 读写锁

与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。读写锁状态:一把读写锁具备三种状态:1.读模式下加锁状态(读锁)2.写模式下加锁状态(写锁)3.不加锁状态读写锁特性:1.读写锁是“写模式加锁”时,解锁前,所有对该锁加锁的线程都会被阻塞。2.读写锁是“读模式加锁”时,如果线程以读模式对其加锁会成功;如果以写模式加锁会阻塞。3.读写锁是“读模式加锁”时,既有试图以写...

2019-11-10 13:25:35 246

原创 死锁

死锁:1.线程试图对同一个互斥量A加锁两次。2.线程1拥有A锁,请求获得B锁;线程2拥有B锁,请求获得A锁。

2019-11-09 13:49:01 62

原创 互斥量

互斥量mutexLinux中提供一把互斥锁mutex(也称为互斥量)。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。资源还是共享的,线程也还是竞争的;但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。但即使有了mutex,如果有线程不按规则来访问数据,依然会造成数据混乱。主要应用函数:pthread_mutex_init函数pthre...

2019-11-09 11:32:02 136

原创 线程同步

线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其他线程为保证数据一致性,不能调用该功能。为了避免数据混乱,线程需要同步。“同步”的目的,是为了避免数据混乱,解决与时间有关的错误。实际上,不仅线程间需要同步,进程间、信号间等等需要同步机制。数据混乱原因:1.资源共享(独享资源则不会)2.调度随机(意味着数据访问会出现竞争)3.线程间缺乏必要的同步机制。...

2019-11-08 22:17:21 388

原创 进程、线程控制原语对比

进程、线程控制原语对比进程线程forkpthread_createexitpthread_exitwaitpthread_joinkillpthread_cancelgetpidpthread_self

2019-11-08 15:15:52 94

原创 线程

LWP:light weight process,轻量级的线程,本质仍然是进程。进程:独立地址空间,拥有PCB(Process Control Block)进程控制块。线程:也有PCB,但没有独立的地址空间(共享)区别:在于是否共享地址空间。独居(进程);合租(线程)。linux下:线程:最小的执行单位进程:最小的分配资源单位,可看成是只有一个进程的线程。示例代码pthread_c...

2019-11-07 17:10:55 79

原创 守护进程

守护进程是在后台运行不受终端控制的进程(如输入、输出等),一般的网络服务都是以守护进程的方式运行。通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程脱离终端的主要原因有两点:(1)用来启动守护进程的终端在启动守护进程之后,需要执行其他任务。(2)(如其他用户登录该终端后,以前的守护进程的错误信息不应出现)由终端上的一些键所产生的信号(如中断信号),不应对以前从该终端...

2019-11-07 11:30:32 91

原创 会话、getsid、setsid函数

概念:会话是一个或多个进程组的集合。创建一个会话需要注意以下6点注意事项:1.调用进程不能是进程组组长,该进程变成新会话首进程。2.该进程成为一个新进程组的组长进程。3.需有root权限。4.新会话丢弃原有的控制终端,该会话没有控制终端。5.该调用进程是组长进程,则出错返回。6.建立新会话时,先调用fork,父进程终止,子进程调用setsid(创建会话)。getsid函数pid_...

2019-11-07 10:48:49 1293

原创 进程组

进程组,也称之为作业。代表一个或多个进程的集合。每个进程都属于一个进程组。当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。进程ID==第一个进程ID(组长进程)。getpgrp函数获取当前进程的进程组ID。pid_t getpgrp(void);总是返回调用者的进程组ID。getpgid函数获取指定进程的进程组IDpid_t getpgid(pid_t pid);成...

2019-11-06 22:47:19 176

原创 可/不可重入函数

一个函数在被调用执行期间(尚未调用结束),由于某种时序又被重复调用,称之为“重入”。所谓可重入函数是指一个可以被多个任何调用的过程,任务在调用时不必担心数据是否出错。因为进程在收到信号后,就将跳转到信号处理函数去接着执行,如果信号处理函数中使用了不可重入函数,那么信号处理函数可能会修改原来进程中不应该被修改的数据,这样进程从信号处理函数返回接着执行时,可能会出现不可预料的后果。不可重入函数在信...

2019-11-06 22:25:28 94

原创 pause函数

调用该函数(系统调用)的进程将处于阻塞状态(主动放弃cpu),直到有信号递达将其唤醒。函数原型:int pause(void);返回值:-1 并设置errno为EINTR该函数只有一个返回值,可以理解为只有成功返回值,且为-1,同时errno的值置为EINTR。注意,只有当一个信号递达且处理方式被捕捉时,pause函数引起挂起操作的进程才会被唤醒,而且只有当信号处理完后(调用完用户处理...

2019-11-06 22:10:36 1044

原创 alarm和setitimer函数

alarm函数设置定时器(闹钟)。可代替alarm函数。精度微秒us。在指定seconds后,内核会给当前进程发送14)SIGALRM信号。进程收到该信号,默认动作终止。每个进程都有且只有唯一一个定时器。unsigned int alarm(unsigned int seconds);返回0或剩余的秒数,无失败。setitimer函数setitimer是一个比较常用的函数,可用来实现延...

2019-11-06 19:52:29 434

原创 raise和abort函数

raise和abort函数raise函数:给当前进程发送指定信号(自己给自己发)raise(signo)==kill(getpid(),signo);int raise(int sig);成功:0,失败非0值abort函数:给自己发送异常终止信号 6)SIGABRT信号,终止并产生core文件void abort(void);该函数无返回...

2019-11-06 19:51:20 690

原创 kill函数

kill函数/命令产生信号kill命令产生信号:kill -SIGKILL pidkill函数:给指定进程发送指定信号(不一定杀死)int kill(pid_t pid, int sig);返回值说明:成功执行时,返回0。失败返回-1,errno被设为以下的某个值 EINVAL:指定的信号码无效(参数 sig 不合法) EPERM;权限不够无法传送信号给指定进程 ESRCH:参数 pid...

2019-11-06 19:50:54 913

原创 硬件异常产生信号命令

硬件异常产生信号:除0操作:–>8)SIGFPE(浮点数例外) “F”—float浮点数。非法访问内存 -->11)SIGSEGV(段错误)总线错误 -->7)SIGBUS

2019-11-06 19:50:18 201

原创 终端产生信号命令

终端按键产生信号:Ctrl + c --> 2)SIGINT(终止/中断) “INT”—InterruptCtrl + z --> 20)SIGTSTP(暂停/停止) “T”—Terminal 终端Ctrl + \ --> 3)SIGQUIT(退出)...

2019-11-06 19:49:35 268

原创 信号基本概念

1.信号的概念信号是信息的载体,Linux/UNIX环境下,古老、经典的通信方式,现下依然是最主要的通信手段。2.信号的机制A给B发送信号,B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。信号是软件层面上实现的中断,早期称为“软中断”。3.与信号相关的事件和状态产生信号递达:递送并且到达进程。未决:产生和递达之间的状态...

2019-11-06 17:29:01 1106

原创 共享存储映射—mmap

mmap函数-创建内存映射作用:将磁盘文件的数据映射到内存,用户通过内存就能修改磁盘文件返回值:映射区的首地址-调用成功调用失败:MAP_FALED函数原型:void *mmap{void *addr; size_t length;int prot;int flags;int fd;off_t offset; }addr 映射区首地址,传NULLlength 映射区的大小;会自...

2019-11-06 15:30:12 224

原创 进程间通信—管道pipe

管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:1.其本质是一个伪文件(实为内存缓冲区)2.由两个文件描述符引用,一个表示读端,一个表示写端。3.规定数据从管道的写端流入管道,从读端流出。管道的原理:管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。管道的局限性:1.数据自己读不能自己写。2.数据一旦被...

2019-11-06 14:13:01 133

原创 进程间通信IPC

进程和进程之间不能互相访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。现今常用的进程间通信方式有:1.管道(使用最简单)2.信号(开销最小)3.共享映射区(无血缘关系)4.本地套接字(最稳定)...

2019-11-06 13:59:02 72

空空如也

空空如也

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

TA关注的人

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