自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 流迭代器的一些作用

流迭代器一般有下面的几种作用: //利用流迭代器填充vector { ifstream in("test.txt"); istream_iterator ibegin(in); istream_iterator iend; vector vec(ibegin, iend); copy(vec.begin(), vec.end(), os

2016-01-19 13:30:04 650

原创 关于SOCKET编程

TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。例如UDP段格式,地址0-1是16位的源端口号,如果这个端口号是1000(0x3e8),则地址0是0x03,地址1是0xe8,也就是先发0x03,再发0xe8,这16位在发送主机的缓冲区中也应该是低地址存0x03,高地址存0xe8。但是,如果发送主机是小端字节序的,这16位被解释成0xe803,而不是1000。因此,发送主机把100

2016-01-18 16:37:26 300

原创 关于TCP/IP:下

UDP段的格式如下所示:下面举一个例子来分析一下:以太网首部0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00IP首部0000:45 000010: 00 53 93 25 00 00 80 11 25 ec c0 a8 00 37 c0 a80020: 00 01UDP首部0020:05 d4 00 45 00 3f

2016-01-17 23:01:40 341

原创 关于TCP/IP

关于TCP/IP的几个层次,如下所示:这其中各个层次的数据包的封装如下所示:数据包到达之后由协议栈到达各层的过程如此啊所示:着重要注意一下的就是以太网的帧格式问题:其中的类型字段,主要制订了IP数据报,ARP,RARP 3中类型。源地址及目的地址指的是网卡的硬件地址,长度为6个Byte。以太网帧中的数据长度规定最小46字节,最大1500字节,AR

2016-01-17 11:00:17 657

原创 关于线程间IPC

mutex:多线程经常会出现访问冲突的情况,解决的办法是引入互斥锁。获得锁的线程可以完成“读-修改-写”的操作,然后释放锁给其它线程,没有获得锁的线程只能等待而不能访问共享数据,这样“读-修改-写”三步操作组成一个原子操作,要么都执行,要么都不执行,不会执行到中间被打断,也不会在其它处理器上并行做这个操作。Mutex用 pthread_mutex_t 类型的变量表示,可以通过下面的方式初始

2016-01-16 11:48:39 359

原创 关于线程

由于同一进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:文件描述符表每种信号的处理方式( SIG_IGN 、 SIG_DFL 或者自定义的信号处理函数)当前工作目录用户id和组id 当然,线程也有起独特的组成部分

2016-01-15 14:53:01 291

原创 关于进程间IPC

管道:由pipe函数可以创建管道:#include int pipe(int filedes[2]);它有一个读端一个写端,然后通过 filedes 参数传出给用户程序两个文件描述符, filedes[0] 指向管道的读端, filedes[1] 指向管道的写端(很好记,就像0是标准输入1是标准输出一样)。所以管道在用户程序看起来就像一个打开的文件,通过 read(filedes[0])

2016-01-15 13:48:12 244

原创 关于进程

fork还是先从一个例子说起:#include #include #include #include int main(){ pid_t pid; char * msg; int n; pid = fork(); if(pid < 0){ perror("fork failed!\n"); exit(1);

2016-01-15 12:44:05 611

原创 关于环境变量

系统中实际上存放值一个换进变量表的地址,environ 没有包含在任何头文件中,所以在使用时要用 extern 声明。使用如下所示:#includeint main(){ extern char ** environ; //全局的换进变量表的地址 int i; for(i = 0; environ[i] != NULL; ++i) printf("%

2016-01-15 11:01:17 403

原创 mmap详解

mmap 可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址,对文件的读写可以直接用指针来做而不需要 read / write 函数。#include void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off);int munmap(void *addr, size_

2016-01-15 10:42:46 415

原创 fcntl详解

前面一篇以 read 终端设备为例介绍了非阻塞I/O,为什么不直接对 STDIN_FILENO 做非阻塞 read ,而要重新 open 一遍 /dev/tty 呢?因为 STDIN_FILENO 在程序启动时已经被自动打开了,而我们需要在调用 open 时指定 O_NONBLOCK 标志。这里介绍另外一种办法,可以用 fcntl 函数改变一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞等

2016-01-14 22:57:11 476

原创 Linux read / write详解

read 函数从打开的设备或文件中读取数据。#include ssize_t read(int fd, void *buf, size_t count);返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0参数 count 是请求读取的字节数,读上来的数据保存在缓冲区 buf 中,同时文件的当前读写位置向后移。注意这个读写位

2016-01-14 22:32:02 759

原创 GDB学习:4

在写程序的时候,最容易遇到的一类问题基本上就是段错误的问题,可以借助gdb来解决这类问题,下面是个例子:int main(void){ int man = 0; scanf("%d", man); return 0;}运行输入会出现段错误:root@wc:~/Codes/Learn/learnGDB# ./segfault 1段错误 (核心已转储)下面开

2016-01-14 10:52:44 802

原创 GDB学习:3

下面看一下观察点调试:这里的例子如上所示:#includeint main(void){ int sum = 0, i = 0; char input[5]; while (1) { sum = 0; scanf("%s", input); for (i = 0; input[i] != '\0'; i++)

2016-01-14 10:31:12 260

原创 GDB学习:2

调试中的很重要的一环就是断点了,下面来看看断点:首先是测试程序:#includeint main(void){ int sum = 0, i = 0; char input[5]; while (1) { scanf("%s", input); for (i = 0; input[i] != '\0'; i++)

2016-01-13 22:45:06 303

原创 GDB学习:1

首先函数实例如下所示:#include int add_range(int low, int high){ int i, sum; for (i = low; i <= high; i++) sum = sum + i; return sum;}int main(void){ int result[100]; result[0]

2016-01-13 17:46:38 328

原创 学会使用makefile:5

下面就是介绍一下简单的常用的makefile指令:-n选项会答应出执行指令执行的顺序,但是不会真的去执行这个指令,这有助于确保某个指令的顺序执行的是正确的-C选项可以切换到另一个目录下执行那个目录下的makefile,例如可以用于退回到上一层去执行当前层的makefile:cd ..make -C learnMakeFilemake: Enter Entering director

2016-01-12 17:15:35 408

原创 学会使用makefile:4

这里主要介绍一下如何处理编译文件以来的问题:main.o: main.h stack.h maze.hstack.o: stack.h main.hmaze.o: maze.h main.h 可见上面几个文件都依赖与几个头文件,实际上自己一个一个动手去写会比较麻烦,而且还容易弄错。可以用 gcc 的 -M 选项自动生成目标文件和源文件的依赖关系。如果像去除对系统库文件的以来关系,可以去使用

2016-01-12 17:07:01 317

原创 学会使用makefile:3

前面写的makefile的相关只是都没有使用到变量,依照变量,makefile可以使用的非常多变。foo = $(bar)bar = Huh?all: @echo $(foo) 上面这个例子执行 make 将会打出 Huh?当 make 读到 foo = $(bar) 时,确定 foo 的值是 $(bar) ,但并不立即展开 $(bar) ,然后读到 bar = Huh? ,确

2016-01-12 16:26:35 355

原创 学会使用makefile:2

前面一篇介绍的makefile只是较为简单普通的写法,还是有很多改进的余地的。例如依赖不一定要写在一条规则中,也可以拆开写,例如:main.o: main.h stack.h maze.hmain.o: main.c gcc -c main.c这么一来上面的例子可以该写成下面的形式:main:main.o stack.o maze.o gcc mai

2016-01-12 15:01:08 324

原创 学会使用makefile:1

假设有下面几个文件:maze.hmaze.cmain.hmain.cstack.hstack.c最简单的编译方法当然就是 gcc maze.c stack.c main.c -o main但是这个方法不好,当对maze.c做了一点点的修改之后就要重新编译那些没有修改的文件。当然首先想到的解决办法就是用下面这种方式gcc -c main.cgcc -c maze.cgc

2016-01-12 13:08:16 485

空空如也

空空如也

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

TA关注的人

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