<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[一只小苹果的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/IFLTEK</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; IFLTEK]]></copyright><item><title><![CDATA[多进程实现并发服务器]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/112300146</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/112300146</guid><author>IFLTEK</author><pubDate>Wed, 06 Jan 2021 23:56:35 +0800</pubDate><description><![CDATA[服务器：
1.打印出客户端的IP地址和端口号，并发送返回给客户端
2.可以同时连接多个客户端

实现思路：
第一部分：
1.创建socket()
2.给套接字命名bind
3.创建监听上限listen()
第二部分：
while(1){
cfd=accept(); //接收客户端的连接请求
pid=fork(); 创建子进程
if(pid==0){
//进入子进程，子进程需要完成如下事情：
1.子进程无须监听，关闭监听套接字
2.读取客户端发送过来的字母
3.完成小写转大写
4.将转换完成后的大写字母返回给]]></description><category></category></item><item><title><![CDATA[Linux粘着位]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/112165652</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/112165652</guid><author>IFLTEK</author><pubDate>Mon, 04 Jan 2021 00:16:30 +0800</pubDate><description><![CDATA[粘着位：
在Linux操作系统中，如果一个用户对目录具有写的权限，那么他就可以在这个目录下删除或者重命名文件。如果想我们创建这样一个目录，所有具有写权限的用户都可以修改文件或创建文件，但是不能删除文件。这个时候只需要对该目录设置粘着位即可。
设置粘着位：
1.chmod 1777  目录名
2.chmod o+t  目录名
取消粘着位：
1.chmod 777  目录名
2.chmod o-t  目录名

在设置粘着位后other组后面会出现一个t

...]]></description><category></category></item><item><title><![CDATA[3.3 Data Memeber的存取]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/111872665</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/111872665</guid><author>IFLTEK</author><pubDate>Mon, 28 Dec 2020 18:55:11 +0800</pubDate><description><![CDATA[3.3 Data member存取
1.静态成员的存取
static member可视为一个global变量，但是只在class生命周期内可见。static member只有一个实例放置在data segment。因此每次取用static member时，在内部会被转换为对唯一的extern实例的操作。取一个static member的地址，会得到指向该数据类型的指针，而不是指向class member的指针。
2.非静态数据成员的存取
非静态成员都是直接存放在每一个class object中，所以只有经过]]></description><category></category></item><item><title><![CDATA[Linux系统编程——access函数]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/111601727</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/111601727</guid><author>IFLTEK</author><pubDate>Wed, 23 Dec 2020 23:51:25 +0800</pubDate><description><![CDATA[#include&lt;unistd.h&gt;
int access(const char* pathname, int mode);

参数一：路径名
参数二：
F_OK 值为0，判断文件是否存在
X_OK 值为1，判断对文件是可执行权限
W_OK 值为2，判断对文件是否有写权限
R_OK 值为4，判断对文件是否有读权限
注：后三种可以使用或“|”的方式，一起使用，如W_OK|R_OK
/*
 *access函数用来测试访问文件的能力
 * */
#include &lt;unistd.h&gt;
#i]]></description><category></category></item><item><title><![CDATA[alarm函数实战]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/110955607</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/110955607</guid><author>IFLTEK</author><pubDate>Thu, 10 Dec 2020 16:29:36 +0800</pubDate><description><![CDATA[alarm函数
1.头文件：#include &lt;unistd.h&gt;
2.函数：  unsigned int alarm(unsigned int seconds);
3.作用：设置一个定时器，当计时器时间到达的时候，产生一个AIGALRM信号，此时可以注册一个函数去捕捉这个信号，若不设置捕捉信号则默认终止该进程。
4.参数：定时的时间
5.返回值：上个闹钟还剩下的时间
总结：alarm函数就是用来定时发送一个SIGALRM信号给当前进程。
案例：
设置一个两秒的定时器，并注册一个信号捕捉函数，打]]></description><category></category></item><item><title><![CDATA[Linux系统编程——信号]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/110953662</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/110953662</guid><author>IFLTEK</author><pubDate>Thu, 10 Dec 2020 16:07:56 +0800</pubDate><description><![CDATA[信号的共性
1.简单
2.不能携带大量信息
 3.满足特定条件才能发送 
信号的机制
1.信号是软件层面的中断。一旦信号产生，无论程序运行到什么位置都必须结束
2.所有信号的产生以及处理都是内核产生.
信号的产生
1.按键产生 程ctrl+c ,ctrl+v
2.系统调用产生 kill函数
3.定时器 alarm,setitimer
4.硬件异常产生 非法访问内存
5.命令产生 如kill命令
信号的未决与递达
1.递达：信号产生递送并到达进程，直接被内核处理了
2.未决： 产生和递达中间，主要是由于阻塞导]]></description><category></category></item><item><title><![CDATA[mmap共享内存映射实战]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/110846715</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/110846715</guid><author>IFLTEK</author><pubDate>Mon, 07 Dec 2020 22:44:47 +0800</pubDate><description><![CDATA[什么是mmap函数？
mmap函数用于申请一段内存空间。我们可以将这一段内存空间作为进程之间通信的共享内存也可以将文件直接映射其中。munmap函数则释放由mmap函数创建的这段内存空间。函数定义如下：
   #include &lt;sys/mman.h&gt;

   void *mmap(void *addr, size_t length, int prot, int flags,
              int fd, off_t offset);
   int munmap(void *add]]></description><category></category></item><item><title><![CDATA[Linux系统编程——fifo命名管道]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/110734370</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/110734370</guid><author>IFLTEK</author><pubDate>Sun, 06 Dec 2020 14:39:27 +0800</pubDate><description><![CDATA[定义
fifo也被称为命名管道。未命名的管道只能在两个相关的进程之间使用，而且这两个进程还有一个共同的创建了他们的祖先进程，但是fifo，不相关的进程也能交换数据。
fifo的创建
fifo是一种文件类型，fifo的创建有两种方式。
1.直接用命令创建 mkfifo
2.利用函数创建
int mkfifo（const char *pathname,mode_t,mode）

下面用一个案例演示从一个进程发送数据到另外一个不相干的进程。
发送端：
#include &lt;unistd.h&gt;
#incl]]></description><category></category></item><item><title><![CDATA[pipe管道实现进程间的通信]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/110679409</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/110679409</guid><author>IFLTEK</author><pubDate>Sat, 05 Dec 2020 16:53:09 +0800</pubDate><description><![CDATA[pipe
1.管道由pipe函数创建
2.管道的本质是伪文件（不占用磁盘空间，只占用内存）
3.管道由两个文件描述符的引用，一个fd[0]读,一个fd[1]写
4.数据从管道的写端流入，读端流出
5.管道的原理是内核缓冲区（4k）借助环形队列机制实现
pipe的局限性
1.进程不能自己写数据自己读数据，需要有两端
2.管道中的数据不可以反复读取，一旦读走，管道不复存在
3.管道四半双工通信，数据只能单向移动
4.只有在拥有共同祖先的时候才能使用管道
pipe函数的定义
pipe函数创建并打开管道
#incl]]></description><category></category></item><item><title><![CDATA[wait与waitpid函数]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/110633328</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/110633328</guid><author>IFLTEK</author><pubDate>Fri, 04 Dec 2020 13:37:21 +0800</pubDate><description><![CDATA[函数的定义
   #include &lt;sys/wait.h&gt;
   pid_t wait(int *wstatus);
   pid_t waitpid(pid_t pid, int *wstatus, int options);

wait函数
  pid_t wait(int *wstatus);

int *wstatus：传出参数，如果不关心子进程结束的原因，那么直接传NULL进去即可
返回值：
成功：返回回收进程的ID
失败：返回-1
waitpid函数
pid_t waitpid(p]]></description><category></category></item><item><title><![CDATA[Linux系统编程——exec函数族]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/110604500</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/110604500</guid><author>IFLTEK</author><pubDate>Fri, 04 Dec 2020 01:00:02 +0800</pubDate><description><![CDATA[当我们需要在子进程中去执行其他的程序的时候，我们就需要用到exec系列函数
#include &lt;unistd.h&gt;

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const]]></description><category></category></item><item><title><![CDATA[父子进程共享]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/110598100</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/110598100</guid><author>IFLTEK</author><pubDate>Thu, 03 Dec 2020 23:56:16 +0800</pubDate><description><![CDATA[父子进程共享：
刚fork后

数据段
代码段
堆
栈
环境变量，全局变量、宿主目录位置、进程工作目录位置、信号处理方式等等。

 父子进程不同（重点）：

进程id
返回值
各自的父进程
进程创建的时间
闹钟
未决信号集

 父子进程共享（重点）：
1.文件描述符（fd）
2.mmap映射区
父子进程数据共享的原则：读时共享，写时复制
读时共享：如果子进程只是需要读取数据，完全没有必要再复制一份数据。
写时复制：子进程需要更改文件的时候，这个时候需要复制一份数据过来。

...]]></description><category></category></item><item><title><![CDATA[fork函数循环创建子进程]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/110560604</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/110560604</guid><author>IFLTEK</author><pubDate>Thu, 03 Dec 2020 18:54:58 +0800</pubDate><description><![CDATA[fork函数
fork函数主要用来在linux下创建进程
fork函数的定义如下：
#include &lt;unistd.h&gt;
pid_t fork(void)

fork函数一次调用返回两个值
若fork成功
子进程返回0
父进程返回子进程的pid号
若fork失败
父进程返回-1
案例：利用fork函数循环创建5个进程
#include &lt;unistd.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int  main()]]></description><category></category></item><item><title><![CDATA[fcntl函数实现dup]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/110546414</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/110546414</guid><author>IFLTEK</author><pubDate>Thu, 03 Dec 2020 16:46:25 +0800</pubDate><description><![CDATA[##fcntl函数的定义
fcntl（file control），对文件描述符提供各种各样的控制操作，fcntl是POSIX规范指定的首选方法。
函数的定义：
#include  &lt;fcntl.h&gt;
int fcntl(int fd,int cmd,…)
参数1:被操作文件的文件描述符
参数2：指定执行何种操作
参数3 可选参数
##用fcntl实现dup的功能
int newfd=fcntl(int oldfd, FDUPFD,int new fd)
参数一：需要指向的oldfd
参数二：命令]]></description><category></category></item><item><title><![CDATA[输入输出重定向&dup、dup2]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/110529851</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/110529851</guid><author>IFLTEK</author><pubDate>Thu, 03 Dec 2020 14:30:57 +0800</pubDate><description><![CDATA[输入输出重定向&amp;dup、dup2
一、输入输出重定向
输入重定向：将文件导入指定命令中
输出重定向：将原本输出打开屏幕上数据信息写入到文件当中
标准输入重定向（STDIN,文件描述符为0）：默认从键盘输入，也可以从其他文件或者命令中输入
标准输出重定向（STDOUT,文件描述符为1）：默认输出到屏幕
标准输出重定向符号
1“&gt;”将标准输出重定向到指定文件中（清空原有数据）
2“&gt;&gt;”将标准输出重定向到指定文件中（追加到原有数据后面）
下面以&gt;为例
1.首先用touch创建一个]]></description><category></category></item><item><title><![CDATA[身份证验证程序（一）]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/100998567</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/100998567</guid><author>IFLTEK</author><pubDate>Tue, 01 Dec 2020 14:08:19 +0800</pubDate><description><![CDATA[身份证号码验证（一）——面向对象 身份证号码的验证我们在网上已经能够看到很多的代码了，相关的资料也有很多。但是很多都是用面向过程的方法来编写的，今天我们换一种思路用面向对象的方法来编写这个程序。 在编写一个程序之前我们要首先要学会调研。那么在这个程序中我们要首先了解的是身份证号码校验的条件是什么。因为这是第一版本我们的条件很简单，就是简单的用校验码来校验一个身份证号码是否正确。 身份证号码的编排有...]]></description><category></category></item><item><title><![CDATA[身份证验证程序（二）]]></title><link>https://blog.youkuaiyun.com/IFLTEK/article/details/101168454</link><guid>https://blog.youkuaiyun.com/IFLTEK/article/details/101168454</guid><author>IFLTEK</author><pubDate>Tue, 01 Dec 2020 14:07:25 +0800</pubDate><description><![CDATA[上一篇文章说到了身份证验证最基础的方法，现在我们来讲讲其中的细节问题。比如说身份证中的出生日期是不可以小于1900也不能大于当前的时间的。这一篇文章我们就来探讨一下这个问题。废话不多说我们先上代码。
*def ___Date_Check(self, ID):
"""
创建一个函数用于判定关于身份证信息中的日期是否正确
如果这里我们定义身份证上的日期要大于1900，同时小于当前的日期
"""
ID_...]]></description><category></category></item></channel></rss>