今天八月三十一了。。。暑假要结束了虽然感觉甚至没有暑假。现在回忆一下这一个月来的生活,下面进入碎碎念模式。。 啊,其实感觉和其他人相比我算是比较舒服的了,毕竟可以天天晚上回家吹空调233333333,每天早上六点五十起床,一共留校了四周前两周半基本都是七点二十就到学校了。后一周半基本上就是赶五十前到了,emmmm,来的早也进不去。每天十点往家走,到家差不多十点半了,洗个澡就睡了该追的番剧还是得追。话说这一个月有好好吃早饭,平时在学校基本没吃过早饭的。中午第一周跟着大家一起定的快餐,但是很奇怪,每次都会拿到不爱吃的豆芽菜和青椒,明明别人都没有的,我脸怎么这么黑。。。于是后来就自己点外卖了,周先生的饭性价比很高,就是米饭的味道有些微妙,晚饭前两周还有去民餐吃的,后来因为发现自己的体重又上升了于是晚饭戒了。中途还回过几次宿舍,发现开始修浴室了,这真是个好消息,下午终于不用纠结穿着人字拖拿着洗澡的东西是先去吃饭还是先洗澡了。自从换了地方后发现了学长留下的键盘,于是借用了一段时间,哇,机械键盘用起来真是爽啊,笔 继续阅读 >>


田正东 18/08/31 01:35:11
一、什么是多路复用? 关于什么是I/O多路复用,在知乎上有个很好的回答,可以参考。   这里记录一下自己的理解。我认为要理解这个术语得从两方面去出发,一是:多路是个什么概念?二是:复用的什么东西?先说第一个问题。多路指的是多条独立的i/o流,i/o流可以这么理解:读是一条流(称之为读流,比如输入流),写是一条流(称之为写流,比如输出流),异常也是一条流(称之为异常流),每条流用一个文件描述符来表示,同一个文件描述符可以同时表示读流和写流。再来看第二个方面,复用的是什么东西?复用的是线程,复用线程来跟踪每路io的状态,然后用一个线程就可以处理所有的io。        当然,不提什么I/O多路复用也能在一个线程就处理完所有的io流,用个while循环挨个处理一次不就解决了嘛?那为什么还要提出这个技术呢?原因就是刚才我们想的方法(轮询)效率太低了,资源利用率也不高。试想一下,如果某个io被设置成了阻塞io,那么其他的io将被卡死,也就浪费掉了其他的io资源。另一方面,假设所有io被设置成非阻塞 继续阅读 >>


田正东 18/08/16 16:28:14
四、私有数据 在多线程环境下,进程内的所有线程共享进程的数据空间,因此全局变量为所有线程共有。在程序设计中有时需要保存线程自己的全局变量,这种特殊的变量仅在某个线程内部有效。在线程内部,线程私有数据可以被各个函数访问,但他对其他线程是屏蔽的。线程私有数据采用了一种被称为一键多值的技术,即一个键对应多个数值。访问数据时都是通过键值来访问,好像是对一个变量进行访问,其实是在访问不同的数据。使用线程私有数据时,首先要为每个线程数据创建一个相关联的键。在各个线程内部,都使用这个公用的键来指代线程数据,但是在不同的线程中,这个键代表的数据是不同的。操作线程私有数据的函数主要有4个,分别是创建,设置,读取,删除: #include <pthread.h> int pthread_key_create(pthread_key_t *key,void(*destr_function)(void*)); int pthread_setspecific(pthread_key_t key,const (vo 继续阅读 >>


田正东 18/08/07 21:10:55
一、线程 什么是线程? 线程是计算机中独立运行的最小单位,运行时占用很少的系统资源。由于每个线程占用的CPU时间是由系统分配的,因此可以把线程看作操作系统分配CPU时间的基本单位。线程是交替进行的。 线程的优点: 在多进程情况下,每个进程都有自己独立的地址空间,而在多线程情况下,同一进程内在线程共享进程的地址空间。因此,创建一个新的进程时就要耗费时间来为其分配系统资源,而创建一个线程花费的时间要少的多。 在系统调度方面,由于进程地址空间独立而线程共享地址空间,线程间的切换速度要远快过进程间的切换速度。 在通信机制方面,进程间的数据空间相互独立,彼此通信要以专门的通信方式进行,通信时必须经过操作系统。而同一进程内的多个线程共享数据空间,一个线程的数据可以直接提供给其他线程使用,而不必经过操作系统。因此线程间的通信更加方便省时。 线程可以提高应用程序的响应速度。在图像界面程序中,如果有一个非常耗时的操作,她会导致其他操作不能进行而等待这个操作,此时界面响应用户操作的速度会变得很慢。多线程环境下可 继续阅读 >>


田正东 18/08/07 08:46:28
五、执行新程序 当已经创建子进程后,子进程通常会调用exec函数来执行另一个程序。系统调用exec用于执行一个可执行程序来代替当前进程的执行映像。在exec调用的过程中没有产生新的子进程,当一个进程时他本身就死亡了,系统把代码替换成新程序的代码,废弃原有的数据段,堆栈段,用新的代替。唯一不变的就是进程ID,对系统而言还是同一个进程,但执行的已经是另一个程序了 exec函数          说起exec函数首先要了解环境变量概念,本文不做描述          Linux 下exec函数族有六种不同的调用形式 #include <unistd.h> int execl(const char *path, const char *arg, ...) int execv(const char *path, char *const argv[]) int execle(const char *path, const char *arg, ..., char *const en 继续阅读 >>


田正东 18/07/31 10:14:24
一、进程 进程是一个动态实体,是程序的一次执行过程,是操作系统资源分配的基本单位。进程是运行中的程序,程序是一些保存在硬盘上的可执行代码。 二、进程结构 Linux中进程由三部分组成:代码段,数据段,堆栈段 代码段(存放可执行代码) 数据段(存放程序全局变量,常量,静态变量) 堆栈段(堆存放动态分配的内存变量,栈用于函数调用,存放函数的参数,函数内部定义的局部变量) 三、创建进程 进程创建的两种方式 由操作系统创建:                  由操作系统创建的进程之间的关系平等,一般不存在资源继承关系。 由父进程(创建该进程的进程称父进程)创建:                  对于父进程创建的进程(子进程),子进程和父进程存在隶属关系。父子进程共享代码段,子进程还获得父进程数据段、堆、栈的复制。 fork函数 #include <sys/types.h> #include <unistd.h> pid_t 继续阅读 >>


田正东 18/07/30 17:37:10
本周的项目任务是实现ls命令,经过三天的努力。。。实现了ls -a -l -R -i功能 我是按照书上的框架做的,因为没有用链表。。所以-R并不能完全跑完根目录。。。日后有时间再写一个链表版的吧。。 下面是代码: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <linux/limits.h> #include <dirent.h> #include <grp.h> #include <pwd.h> #include <errno.h> #include <math.h> #include & 继续阅读 >>


田正东 18/07/29 15:32:38
1.gets gets是从标准输入设备读取字符串的函数,函数原型 char * gets ( char * str );  刚开始学习C语言时觉得gets这个函数相当的好用,因为他比scanf写起来要短,而且可以输入有空格的字符串。但是越往后学就会发现,在C语言中用GCC编译使用了gets函数的源文件,编译器会给警告。 warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration] 警告: the `gets' function is dangerous and should not be used.   原因是gets可以无限读取,不会判断上限,如果无限输入会造成栈空间溢出,在程序返回时,不能正常的找到返回地址,程序将发生不可预测行为。如果用了gets,像我们现在写的小程序可能在PC端上会闪退,但如果在大型项目中就会造成很严重的损失。因此我们应 继续阅读 >>


田正东 18/07/28 15:29:45
1