自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 web服务器的开发(简易版本)

总体介绍使用浏览器作为客户端访问web服务器;使用的知识总结:  socktet编程:    socket -> setsockopt -> bind -> listen -> read -> write -> send -> recv -> close ;  常用网络服务器模型:    多进程版本;  &

2021-02-05 21:04:53 655

原创 信号阻塞/文件描述符阻塞

信号阻塞信号递达(Delivery):实际执行信号的处理动作。信号未决(pending):信号从产生到递达之间的状态。信号阻塞(block):产生信号,信号也不会被递达。被阻塞的信号产生时将保持在未决状态,信号被阻塞了就不被递达。未决信号集和阻塞信号集未决信号集:    信号产生后由于某些原因(主要是阻塞)不能抵达,这类信号的集合称之为未决信号集。在屏蔽解除前,信号一直处于未决状态;若是信号从阻塞信号集中解除阻塞,则该信号会被处理,并从未决

2021-01-27 15:50:57 401

原创 TCP三次握手和四次挥手/滑动窗口

OSI七层模型TCP/IP模型二者之间的关系:三次握手/四次挥手通信的时候不再需要SYN标识位了, 只有在请求连接的时候需要SYN标识位.传输数据的时候的随机序号seq就是最近一次对方发送给自己的ACK的随机序号值, 而发给对方的ACK就是上次刚刚发给对方的ACK的值.TCP数据报的格式:上图中ACK序号对应下图中32位确认序号,其中SYN对应32位序号。完整过程如图:Seq和SYN对应上图中 32位序号 ACK对应32位确认序号图中发送的ACK确认包表示给对方发送数据的一个

2021-01-18 11:39:25 298

原创 socket编程及API编程函数

网络字节序大端和小端的概念    小端:低位地址存放低位数据,高位地址存放高位数据;    大端:低位地址存放高位数据,高位地址存放低位数据;大端和小端的使用场合:    大端和小端只是对数据类型长度是两个及以上的, 如int short, 对于单字节 没限制, 在网络中经常需要考虑大端和小端的是IP和端口.#include <stdio.h>#include

2021-01-10 11:37:17 248

原创 信号变量/信号量

信号变量条件本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。使用互斥量保护共享数据使用条件变量可以使线程阻塞, 等待某个条件的发生, 当条件满足的时候解除阻塞条件变量的两个动作:条件不满足,线程阻塞条件满足,通知阻塞的线程解除阻塞, 开始工作。条件变量相关函数pthread_cond_t cond;定义一个条件变量int pthread_cond_init(pthread_cond_t *restrict cond, const pth

2021-01-05 20:50:30 298

原创 互斥锁/读写锁

互斥锁Linux中提供一把互斥锁mutex(也称之为互斥量)。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。资源还是共享的,线程间也还是竞争的,但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。主要相关函数pthread_mutex_t 类型其本质是一个结构体,为简化理解,应用时可忽略其实现细节,简单当成整数看待。pthread_mutex_t mutex; 变量mutex只有两种取值1、0。pthread_mutex_init函数函数描述:

2021-01-05 17:58:02 319 2

原创 线程相关函数/设置线程分离属性

函数作用创建一个线程函数原型int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine) (void *),void *arg);返回值:成功:返回0失败:返回错误号函数参数:pthread_t:传出参数,保存系统为我们分配好的线程ID当前Linux中可理解为:typedef unsigned long int pthread_t。attr:通常传NULL,表示使用线

2021-01-02 16:05:56 451

原创 线程

线程定义线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。 –百科轻量级的进程(LWP: light weight process

2020-12-30 21:33:36 165

原创 sigaction()函数

函数说明注册一个信号处理函数函数原型:int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);函数参数signum:捕捉的信号act:传入参数,新的处理方式oldset:传出参数,旧的处理方式struct sigaction {void (*sa_handler)(int); // 信号处理函数void (*sa_sigaction)(int, siginfo_t *, void

2020-12-30 17:53:06 332

原创 守护进程/会话setsid()

守护进程Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字,如vsftpdLinux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输出机制的实现;ftp服务器;nfs服务器等。总结:守护进程的特点linux后台服务进程独立于控制终端周期性的执行某种任务不受用户登录和注销的影响一般采用以d结尾的名字,如vsftpd

2020-12-30 17:25:03 155

原创 信号集相关

信号集相关未决信号集和阻塞信号集的关系阻塞信号集是当前进程要阻塞的信号的集合,未决信号集是当前进程中还处于未决状态的信号的集合,这两个集合存储在内核的PCB中。以SIGINT为例说明信号未决信号集和阻塞信号集的关系:当进程收到一个SIGINT信号(信号编号为2),首先这个信号会保存在未决信号集合中,此时对应的2号编号的这个位置上置为1,表示处于未决状态;在这个信号需要被处理之前首先要在阻塞信号集中的编号为2的位置上去检查该值是否为1:如果为1,表示SIGNIT信号被当前进程阻塞了,这个信号暂时不

2020-12-28 17:15:20 93

转载 linux信号 小结

信号信号的机制进程A给进程B发送信号,进程B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕后再继续执行。与硬件中断类似——异步模式。但信号是软件层面上实现的中断,早期常被称为“软中断”。[注]:每个进程收到的信号,都是由内核负责发送的。信号的状态信号有三种状态:产生、未决和递达信号的产生按键产生,如:ctrl+c、ctrl+z、crtl+\系统调用产生,如:kill、raise、abort软件条件产生,如:定时器 alarm硬件

2020-12-28 11:38:57 115

转载 mmap()函数 (转载+整理)

内存映射区存储映射I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。从缓冲区中取数据,就相当于读文件中的相应字节;将数据写入缓冲区,则会将数据写入文件。这样,就可在不使用read和write函数的情况下,使用地址(指针)完成I/O操作。使用存储映射这种方法,首先应通知内核,将一个指定文件映射到存储区域中。这个映射工作可以通过mmap函数来实现。内存映射 mmap的理解mmap()函数函数作用建立存储映射区函数原型void *mmap(void *

2020-12-27 20:38:58 6441

原创 管道-pipe()函数使用

进程间通信linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。进程间通信的方式在进程间完成数据传递需要借助操作系统提供特殊的方法,如:文件、管道、信号、共享内存、消息队列、套接字、命名管道

2020-12-27 17:22:52 2465 2

原创 僵尸进程和孤儿进程

孤儿进程概念若子进程的父进程已经死掉,而子进程还存活着,这个进程就成了孤儿进程。为了保证每个进程都有一个父进程,孤儿进程会被init进程领养,init进程成为了孤儿进程的养父进程,当孤儿进程退出之后,由init进程完成对孤儿进程的回收。僵尸进程概念若子进程死了,父进程还活着, 但是父进程没有调用wait或waitpid函数完成对子进程的回收,则该子进程就成了僵尸进程。解决方案由于僵尸进程是一个已经死亡的进程,故不能使用kill命令将进程杀死;可以通过杀死父进程的方法消除僵尸进程:杀死其父

2020-12-27 09:46:15 158

原创 wait()/waitpid()函数使用

wait()函数作用阻塞并等待子进程退出回收子进程残留资源获取子进程结束状态(退出原因)函数原型pid_t wait(int *status);status参数:WIFEXITED(status):为非0 → 进程正常结束WEXITSTATUS(status):获取进程退出状态WIFSIGNALED(status):为非0 → 进程异常终止WTERMSIG(status): 取得进程终止的信号编号。返回值:成功:清理掉子进程ID;失败:-1(没有子进程)//父

2020-12-26 21:08:15 225

原创 exec()函数族

函数作用有的时候需要在一个进程里面执行其他的命令或者是用户自定义的应用程序,此时就用到了exec函数族当中的函数。使用方法 :一般都是在父进程里面调用fork创建处子进程,然后在子进程里面调用exec函数。execl()函数函数原型int execl(const char *path, const char arg, … / (char *) NULL */);参数介绍:path: 要执行的程序的绝对路径变参arg: 要执行的程序的需要的参数arg:占位,通常写应用程序的名字arg后

2020-12-26 20:21:51 1139

原创 fork()函数使用

fork()函数函数作用创建子进程函数原型pid_t fork(void);返回值调用成功:父进程返回子进程的PID,子进程返回0;调用失败:返回-1,设置errno;fork()函数总结fork()函数返回值父进程返回子进程的PID,是一个大于0的数;子进程返回0;特别注意不是一个fork()函数在一个进程中返回两个值,而是父子进程各自返回一个值。子进程创建成功后,代码执行的位置父进程执行到哪里,子进程从该位置开始执行。区分父子进程通过fork()函数的返回值;

2020-12-26 20:04:14 123

原创 fcntl()函数用法

fcntl()函数函数描述改变已经打开的文件的属性函数原型int fcntl(int fd, int cmd, … /* arg */ );若cmd为F_DUPFD, 复制文件描述符, 与dup相同若cmd为F_GETFL, 获取文件描述符的flag属性值若cmd为 F_SETFL, 设置文件描述符的flag属性函数返回值返回值取决于cmd;成功:1.若cmd为F_DUPFD, 返回一个新的文件描述符;2.若cmd为F_GETFL, 返回文件描述符的flags值;3.若cmd为

2020-12-26 17:54:21 202

原创 dup()/dup2()函数使用

dup()函数函数功能:复制文件描述符;函数原型int dup(int oldfd);oldfd --需要复制的文件描述符;函数返回值成功:返回最小且没有被占用的文件描述符;失败:返回-1,设置error;//测试dup函数复制文件描述符#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <unistd.h

2020-12-26 11:39:21 292

原创 stat()/lstat()函数使用

stat()/lstat()函数功能获取文件属性定义函数函数原型:int stat(const char *pathname, struct stat *buf);int lstat(const char *pathname, struct stat *buf);函数返回值:成功为:0失败为:-1struct stat { dev_t st_dev; //文件的设备编号 ino_t st_ino; //

2020-12-26 10:57:57 2426 1

原创 leek()函数使用

@TOCLinux笔记lseek()函数头文件:#include <sys/types.h> #include <unistd.h>定义函数:off_t lseek(int fd, off_t offset, int whence);参数含义参数 offset 的含义取决于参数 whence:1.如果 whence 是 SEEK_SET,文件偏移量将被设置为 offset。2.如果 whence 是 SEEK_CUR,文件偏移量将被设置为 cfo(目前读写位置)

2020-12-26 10:34:49 622

空空如也

空空如也

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

TA关注的人

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