随笔分类 -  网络编程

linux select函数详解
摘要:linux select函数详解 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状态。(我们是要想从一个文件描述符中读或者写,还是关注一个描述符中是否出现异常) •我们要等待多长时间 阅读全文

posted @ 2018-03-20 21:16 AlanTu 阅读(70944) 评论(1) 推荐(6) 编辑

Linux深入理解Socket异常
摘要:在各种网络异常情况的背后,TCP是怎么处理的?又是怎样把处理结果反馈给上层应用的?本文就来讨论这个问题。分为两个场景来讨论 建立连接时的异常情况 1 正常情况下 经过三次握手,客户端连接成功,服务端有一个新连接到来。 2 客户端连接了服务端未监听的端口 在这种情况下,服务端会对收到的SYN回应一个R 阅读全文

posted @ 2018-03-14 13:45 AlanTu 阅读(1595) 评论(2) 推荐(1) 编辑

Linux 下socket通信终极指南(附TCP、UDP完整代码)
摘要:linux下用socket通信,有TCP、UDP两种协议,网上的很多教程把两个混在了一起,或者只讲其中一种。现在我把自己这两天研究的成果汇总下来,写了一个完整的,适合初学者参考,也方便自己以后查阅。 首先讲什么是socket,不喜欢理论的可以略过。 Berkeley套接字应用程序接口(API)包括了 阅读全文

posted @ 2018-03-02 16:13 AlanTu 阅读(4175) 评论(0) 推荐(0) 编辑

命名管道FIFO和mkfifo函数
摘要:进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的。如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通信呢?内核提供一条通道不成问题,问题是如何标识这条通道才能使各进程都可以访问它?文件系统中的路径名是 阅读全文

posted @ 2018-02-27 10:09 AlanTu 阅读(7364) 评论(0) 推荐(0) 编辑

管道读写规则和Pipe Capacity、PIPE_BUF
摘要:一、当没有数据可读时 O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。 O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。 示例程序如下: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 阅读全文

posted @ 2018-02-27 10:07 AlanTu 阅读(1659) 评论(0) 推荐(0) 编辑

匿名管道和pipe函数
摘要:一、进程间通信 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Com 阅读全文

posted @ 2018-02-27 10:04 AlanTu 阅读(1657) 评论(0) 推荐(1) 编辑

竞态条件与sigsuspend函数
摘要:一、利用pause和alarm函数实现sleep函数 #include <unistd.h> int pause(void); pause函数使调用进程挂起直到有信号递达。如果信号的处理动作是终止进程,则进程终止,pause函数没有机会返回;如果信号的处理动作是忽略,则进程继续处于挂起状态,paus 阅读全文

posted @ 2018-02-27 10:03 AlanTu 阅读(409) 评论(0) 推荐(0) 编辑

实时信号与sigqueue函数
摘要:一、sigqueue函数 功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用。 原型:int sigqueue(pid_t pid, int sig, const union sigval value); 参数: sigqueue的第一个参数是 阅读全文

posted @ 2018-02-27 10:01 AlanTu 阅读(1266) 评论(0) 推荐(0) 编辑

信号的捕捉与sigaction函数
摘要:一、内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1. 用户程序注册了SIGQUIT信号的处理函数sighandler。 2. 当前正在执行main函数,这时发生中断或异常切 阅读全文

posted @ 2018-02-27 10:00 AlanTu 阅读(3575) 评论(1) 推荐(0) 编辑

信号的阻塞与未决
摘要:一、信号在内核中的表示 实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号,SIGKILL 和 SIGSTOP 不能被阻塞。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递 阅读全文

posted @ 2018-02-27 09:58 AlanTu 阅读(1225) 评论(0) 推荐(0) 编辑

一些信号发送函数和不同精度的睡眠
摘要:一、kill, raise, killpg 函数 int kill(pid_t pid, int sig); int raise(int sig); int killpg(int pgrp, int sig); kill命令是调用kill函数实现的,kill函数可以给一个指定的进程或进程组发送指定的 阅读全文

posted @ 2018-02-27 09:56 AlanTu 阅读(259) 评论(0) 推荐(0) 编辑

信号基本概述
摘要:一、为了理解信号,先从我们最熟悉的场景说起: 1. 用户输入命令,在Shell下启动一个前台进程。 2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断。 3. 如果CPU当前正在执行这个进程的代码,则该进程的用户空间代码暂停执行,CPU从用户态切换到内核态处理硬件中断。 4. 终端驱动程序将C 阅读全文

posted @ 2018-02-27 09:53 AlanTu 阅读(374) 评论(0) 推荐(0) 编辑

终端、作业控制与守护进程
摘要:一、终端的概念 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。默认情况 阅读全文

posted @ 2018-02-27 09:50 AlanTu 阅读(470) 评论(0) 推荐(0) 编辑

wait/waitpid函数与僵尸进程、fork 2 times
摘要:一、僵尸进程 当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态。 A child that term 阅读全文

posted @ 2018-02-27 09:48 AlanTu 阅读(743) 评论(0) 推荐(0) 编辑

exec系列函数和system函数
摘要:一、exec替换进程映象 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。当我们创建 了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。当然,exec系列的函数也可以将当前进程替换掉。 二、 阅读全文

posted @ 2018-02-27 09:47 AlanTu 阅读(3825) 评论(0) 推荐(0) 编辑

fork函数相关总结
摘要:fork的作用是根据一个现有的进程复制出一个新进程,原来的进程称为父进程(Parent Process),新进程称为子进程(Child Process)。系统中同时运行着很多进程,这些进程都是从最初只有一个进程开始一个一个复制出来的。在Shell下输入命令可以运行一个程序,是因为Shell进程在读取 阅读全文

posted @ 2018-02-27 09:44 AlanTu 阅读(461) 评论(0) 推荐(0) 编辑

文件的内核结构file和dup实现重定向
摘要:一、打开文件内核数据结构 1、一个进程打开两个文件 文件状态标志:读、写、追加、同步、非阻塞等 2、一个进程两次打开同一文件 3、两个进程打开同一文件 示例程序: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 阅读全文

posted @ 2018-02-27 09:42 AlanTu 阅读(562) 评论(0) 推荐(0) 编辑

进程基本概述
摘要:一、什么是进程 从用户的角度来看进程是程序的一次执行过程。 从操作系统的核心来看,进程是操作系统分配的内存、CPU时间片等资源的基本单位。 进程是资源分配的最小单位。 每一个进程都有自己独立的地址空间与执行状态。 像UNIX这样的多任务操作系统能够让许多程序同时运行,每一个运行着的程序就构成了一个进 阅读全文

posted @ 2018-02-27 09:40 AlanTu 阅读(559) 评论(0) 推荐(0) 编辑

fcntl 函数与文件锁
摘要:一、fcntl函数 功能:操纵文件描述符,改变已打开的文件的属性 int fcntl(int fd, int cmd, ... /* arg */ ); cmd的取值可以如下: 复制文件描述符 F_DUPFD (long) 设置/获取文件描述符标志 F_GETFD (void) F_SETFD (l 阅读全文

posted @ 2018-02-27 09:38 AlanTu 阅读(679) 评论(0) 推荐(0) 编辑

文件的属性
摘要:一、读取文件元数据 int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); int lstat(const char *path, struct stat *buf); stat() sta 阅读全文

posted @ 2018-02-27 09:36 AlanTu 阅读(260) 评论(0) 推荐(0) 编辑

导航