2016年8月10日

第7章套接字选项

摘要: 一般通过以下函数设置套接字选项:getsockopt和setsockopt函数;fcntl函数;ioctl函数 #include /* See NOTES */ #include int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); ... 阅读全文

posted @ 2016-08-10 00:58 笨拙的菜鸟 阅读(262) 评论(0) 推荐(0) 编辑

select与stdio混合使用的不良后果

摘要: 参考以下链接自己补充实验:http://www.cppblog.com/mysileng/archive/2013/01/15/197284.aspx?opt=admin int main(int argc,char *argv[]){ fd_set rfd; char buf[3]={0}; FD_ZERO(&rfd); while(1){ FD_SET(fileno(stdin),&rfd);... 阅读全文

posted @ 2016-08-10 00:58 笨拙的菜鸟 阅读(494) 评论(0) 推荐(0) 编辑

第6章 I/O多路复用

摘要: 前一章节客户端同时处理两个输入:标准输入和TCP套接字,然而问题在于客户端阻塞于fgets调用期,服务器进程被杀死后,服务器tcp虽然可以正确发送一个fin,但进程正阻塞于标准输入,它无法看到eof,直到从套接字读为止.这样的进程需要一种预先告诉内核的能力,一旦内核发现进程指定的一个或者多个I/O就绪,它就通知进程,这就叫做I/O复用select函数#include #include int se... 阅读全文

posted @ 2016-08-10 00:57 笨拙的菜鸟 阅读(345) 评论(0) 推荐(0) 编辑

第5章-unix网络编程 TCP/服务端程序示例

摘要: 这一章主要是完成一个完整的tcp客户/服务器程序.通过一很简单的例子.弄清客户和服务器如何启动,如何终止,发生了某些错误会发生什么.这些事很重要的 客户端代码#include "unp.h"//static void str_cli1(FILE*fp,int sockfd);int main(int argc,char *argv[]){ int sockfd; struct soc... 阅读全文

posted @ 2016-08-10 00:57 笨拙的菜鸟 阅读(769) 评论(0) 推荐(0) 编辑

unix网络编程第四章----基于TCP套接字编程

摘要: 为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议#includeint socket(int family,int type,int protocol);family表示协议族,比如AF_INET,type表示套接字类型, protocol一般设置为0family: AF_INET ipv4协议type: SOCK_STREAM 字节流套接字 SOCK_D... 阅读全文

posted @ 2016-08-10 00:56 笨拙的菜鸟 阅读(280) 评论(0) 推荐(0) 编辑

第三章-套接字编程

摘要: 套接字结构一般从内核到进程.从进程到内核,其中从内核到进程是值-结果参数的例子地址转换函数推荐使用inet_ntop,inet_pton适用于ipv4跟ipv6套接字地址结构struct sockaddr_in{ uint8_t sin_len;//长度 posix规范不需要这个sa_family_t sin_family; //协议族,无符号短整数.一般表示AF_INETin_port_t s... 阅读全文

posted @ 2016-08-10 00:56 笨拙的菜鸟 阅读(468) 评论(0) 推荐(0) 编辑

unix网络编程第2章

摘要: time_wait状态 可靠地实现tcp全双工连接的终止;(假设客户端先关闭).服务端再关闭,服务端将发送fin ,客户端此时进入time_wait状态.客户端接收到fin.将回一个ack.如果这个ack一旦丢失..time_wait这段时间,会使得服务端重新发送fin(2)使得老的重复分节在网络中消失,五元组相同这个规则存在一个例外:如果到达的SYN的序列号大于前一化身的结束序列号,源自Berk... 阅读全文

posted @ 2016-08-10 00:55 笨拙的菜鸟 阅读(260) 评论(0) 推荐(0) 编辑

unix网络编程第一章demo

摘要: 之前一直以为time_wait状态就是主动关闭的那一方产生.然后这个端口一直不可以用.实际我发现服务端监听一个端口.客户端发来连接后.传输数据后.服务端关闭客户端套接字后.用netstat -nat | grep 端口 查看了产生了time_wait.但客户端依然可以不断连接服务端.然后服务端不断关闭.并不会影响监听端口.原来是只有服务端把监听端口描述符给关闭(不是accept那个连接.虽然,端口... 阅读全文

posted @ 2016-08-10 00:55 笨拙的菜鸟 阅读(544) 评论(0) 推荐(0) 编辑

论epoll的实现

摘要: 论epoll的实现上一篇博客 论select的实现 里面已经说了为什么 select 比较慢。poll 的实现和 select 类似,只是少了最大 fd 限制,如果有兴趣可以自己去看代码。我这里来简单来过一下 epoll 的实现。1) 一次添加select / poll 为了实现简单,不对已有的 fd 进行管理。每次需要传入最大的轮询 fd, 然后每个监听 fd 挂到设备一次导致性能不佳。epol... 阅读全文

posted @ 2016-08-10 00:54 笨拙的菜鸟 阅读(508) 评论(0) 推荐(0) 编辑

Select函数实现

摘要: int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict errorfds, struct timeval *restrict timeout);SYSCALL_DEFINE5(select, int, n, ... 阅读全文

posted @ 2016-08-10 00:52 笨拙的菜鸟 阅读(1248) 评论(0) 推荐(0) 编辑

(转):从内核代码聊聊pipe的实现

摘要: 来源: http://luodw.cc/2016/07/09/pipeof/用linux也有两年多了,从命令,系统调用,到内核原理一路学过来,我发现我是深深喜欢上这个系统;使用起来就是一个字“爽”;当初在看 linux内核原理时,对linux内核源码有种敬畏的心理,不敢涉入,主要是看不懂,直到最近实习的时候,在某次分享会上,某位老师分享了OOM机制, 我很感兴趣,就去看内核代码,发现,原来我能看懂... 阅读全文

posted @ 2016-08-10 00:49 笨拙的菜鸟 阅读(4973) 评论(1) 推荐(0) 编辑

一简单c++程序之反汇编

摘要: #includeusing namespace std;class point3d;class point2d;class point3d{private:int x; int y; int z;public: point3d(int a = 0, int b = 0, int c = 0) :x(a), y(b), z(c) {}};class point2d{ int a; ... 阅读全文

posted @ 2016-08-10 00:47 笨拙的菜鸟 阅读(2964) 评论(0) 推荐(0) 编辑

linux内核之进程的基本概念(进程,进程组,会话关系)

摘要: 进程是操作系统的一个核心概念。每个进程都有自己唯一的标识:进程ID,也有自己的生命周期。一个典型的进程的生命周期如图4-1所示。进程都有父进程,父进程也有父进程,这就形成了一个以init进程为根的家族树。除此以外,进程还有其他层次关系:进程、进程组和会话。进程组和会话在进程之间形成了两级的层次:进程组是一组相关进程的集合,会话是一组相关进程组的集合。这样说来,一个进程会有如下ID:·PID:进程的... 阅读全文

posted @ 2016-08-10 00:42 笨拙的菜鸟 阅读(12552) 评论(2) 推荐(6) 编辑

Linux进程的创建函数fork()及其fork内核实现解析

摘要: 进程的创建之fork()Linux系统下,进程可以调用fork函数来创建新的进程。调用进程为父进程,被创建的进程为子进程。fork函数的接口定义如下:#include pid_t fork(void); 与普通函数不同,fork函数会返回两次。一般说来,创建两个完全相同的进程并没有太多的价值。大部分情况下,父子进程会执行不同的代码分支。fork函数的返回值就成了区分父子进程的关键。fork函数向子... 阅读全文

posted @ 2016-08-10 00:42 笨拙的菜鸟 阅读(2839) 评论(0) 推荐(2) 编辑

linux之Deamon进程创建及其进程exit,_exit,return之间的区别

摘要: Dameon进程又被称做守护进程,一般来说他有以下2个特点:1.生命周期非常长,一旦启动,一般不会终止,直到系统推出,不过dameon进程可以通过stop或者发送信号将其杀死2.在后台执行,不跟任何控制终端关联,终端信号比如:SIGINT,SIGQUIT,SIGTSTP,以及关闭终端都不会影响deamon如何编写Daemon进程,需要遵循以下规则:(1)执行fork()函数,父进程退出,子进程继续... 阅读全文

posted @ 2016-08-10 00:41 笨拙的菜鸟 阅读(2241) 评论(0) 推荐(1) 编辑

深入解析Linux内核I/O剖析(open,write实现)

摘要: Linux内核将一切视为文件,那么Linux的文件是什么呢?其既可以是事实上的真正的物理文件,也可以是设备、管道,甚至还可以是一块内存。狭义的文件是指文件系统中的物理文件,而广义的文件则可以是Linux管理的所有对象。这些广义的文件利用VFS机制,以文件系统的形式挂载在Linux内核中,对外提供一致的文件操作接口。从数值上看,文件描述符是一个非负整数,其本质就是一个句柄,所以也可以认为文件描述符就... 阅读全文

posted @ 2016-08-10 00:40 笨拙的菜鸟 阅读(7585) 评论(0) 推荐(0) 编辑

Linux内核解析之标准I/O库

摘要: 当Linux创建一个进程时,会自动创建3个文件描述符0,1,2,分别对应标准输入,标准输出,错误输出。C库中与文件描述符对应的是文件指针。查看C库头文件stdio.h中的源码typedef struct _IO_FILE FILE; //文件流类型extern struct _IO_FILE *stdin; /* 标准输入流 */extern struct _IO_FILE *stdo... 阅读全文

posted @ 2016-08-10 00:40 笨拙的菜鸟 阅读(1304) 评论(0) 推荐(0) 编辑

第0章Linux环境到内核基础知识

摘要: #includeint main(void){ printf("hello world\n"); return 0;}gcc -g -wall helloworld.c -o hello_world 生成可执行文件,其过程 涉及预处理,编译,汇编,链接等多个步骤预处理:用于处理预处理命令,上面helloworld代码的预处理就是#include,该头文件所有源码将在第一行展开,可使用 gcc ... 阅读全文

posted @ 2016-08-10 00:39 笨拙的菜鸟 阅读(764) 评论(0) 推荐(0) 编辑

Linux之进程的等待与其内核实现解析

摘要: 进程通过fork产生子进程,进程也会死亡,进程退出的时候将会进行内核清理,释放所有进程的资源,资源包括:内存资源,文件资源,信号量资源,共享内存资源,或者引用计数减一,或者彻底释放。 不过进程的退出并没有把所有资源释放,保留一一些资源,比如进程的PID依然被占用,不可被分配,来看看僵尸进程依旧占有的资源:进程控制块task_struct ,内核栈等。这些资源不释放是为了提供一些重要信息,比如... 阅读全文

posted @ 2016-08-10 00:38 笨拙的菜鸟 阅读(3043) 评论(0) 推荐(1) 编辑

linux内核设计与实现第一章

摘要: 1.1 unix的历史 Thompson实现unix 伯克利大学对其进一步开发推出了著名的BSD 其他各大厂商相继推出自己的unix 1.1.2 unix的特性 unix系统是一个强大,健壮,稳定的操作系统 unix中,一切东西都是文件 unix由c编写,移植性非常好 1.1.3unix的总结 Unix现在已经发胀成为一个支持抢占式多任务,多线程,TCP/IP网络的现代化操作... 阅读全文

posted @ 2016-08-10 00:33 笨拙的菜鸟 阅读(367) 评论(0) 推荐(0) 编辑

导航