
Linux系统编程
anton_99
这个作者很懒,什么都没留下…
展开
-
子网掩码
子网掩码也可称为网络掩码。用户通过子网掩码可以很快确认当前主机IP所属的网络类型,其一般的组成为:网络地址部分为“1”,主机地址部分为“0”。 因此,A类地址的子网掩码为255.0.0.0;B类地址的子网掩码为255.255.0.0;C类地址的子网掩码为255.255.255.0。子网掩码的主要作用是判断主机发送的数据包是发送给外网还是内网。主机A向主机B发送数据包,则主机A先将自己的子网掩码与...原创 2019-10-14 09:05:46 · 1687 阅读 · 0 评论 -
流的打开与关闭
如果需要对文件进行读写操作,首先应该得到一个流指针,或者说首先应该将文件打开。#include <stdio.h>FILE *fopen(const char *path, const char *mode);FILE *fdopen(int fd, const char *mode);FILE *freopen(const char *path, const char mod...原创 2019-08-11 20:57:54 · 986 阅读 · 0 评论 -
标准IO与文件IO
文件I/O就是操作系统封装了一系列函数接口供应用程序使用,通过这些接口可以实现对文件的读写操作。上一节说到,文件I/O是采用直接系统调用的方式,因此当使用这些接口对文件进行操作时,就会立刻触发系统调用过程,即向系统内核发出请求之后,系统内核会收到请求执行相关的代码处理请求,决定是否将操作硬件资源或返回结果给应用程序。标准I/O虽然也是使用一系列函数接口对文件进行读写操作,但是函数出自于C库。因此...原创 2019-08-11 20:54:01 · 309 阅读 · 0 评论 -
MAC帧数据包发送代码节选(原始套接字)
/*描述网络接口属性的结构体*/struct ifreq ethreq;/*将网卡的名称eth0拷贝到结构体成员ifr_name中,指定要获取属性的网卡*//*宏IFNAMSIZ表示拷贝的长度*/strcpy(ethreq.ifr_name, “eth0”, IFNAMSIZ);/*获得网卡为eth0接口信息,/*即对ethreq表示的结构体属性信息进行初始化,该信息一定与eth0有关...原创 2019-07-28 14:17:38 · 908 阅读 · 0 评论 -
MAC帧数据包的接收示例(原始套接字)
测试MAC帧数据包使用的传输协议 1 #include <stdio.h> 2 #include <sys/socket.h> 3 #include <stdlib.h> 4 #include <arpa/inet.h> 5 #include <unistd.h> 6 #include <netinet/if...原创 2019-07-28 14:14:48 · 1867 阅读 · 0 评论 -
更改文件名
通过使用rename()函数,既可以重命名文件,有可以将文件移至同一文件系统中的另一目录。函数会将oldpath所表示的现有的一个路径名重命名为newpath参数所指定的路径名。#include <stdio.h> int rename(const char *oldpath, const char *newpath);rename()调用仅操作目录条目,而不移动文件数据,改...原创 2019-08-05 09:00:20 · 307 阅读 · 0 评论 -
文件的截取
在Linux系统有时会有在文件尾端处截去一些数据以缩短文件的需求。因此为了截短文件可以调用函数truncate()和ftruncate()。 #include <unistd.h> #include <sys/types.h> int truncate(const char *path, off_t length); int ftruncate(int fd, ...原创 2019-08-05 08:58:03 · 311 阅读 · 0 评论 -
链路层原始套接字的创建
链路层原始套接字调用socket()函数来创建。第一个参数指定协议族类型为AF_PACKET,第二个参数可以设置为SOCK_RAW或SOCK_DGRAM,第三个参数是协议类型。协议类型protocol不用取值的意义如下表10.2所示。#include <sys/types.h> /* See NOTES */#include <sys/socket.h>...原创 2019-07-22 09:12:33 · 833 阅读 · 0 评论 -
原始套接字
原始套接字(SOCK_RAW)不同于流式套接字、数据报套接字。原始套接字是基于IP数据包的编程,流式套接字只能收发TCP协议的数据,数据报套接字只能收发UDP协议的数据。前面讲述的网络编程都是在应用层收发数据,每个程序只能收到发给自己的数据,即每个程序只能收到来自该程序绑定的端口的数据。收到的数据往往只包括应用层数据,原有的头部信息在传递过程中被“隐藏”了。协议栈的原始套接字从实现上可以分为“链...转载 2019-07-22 09:09:08 · 288 阅读 · 0 评论 -
UNIX域流式套接字简单示例(无差错,可编译)
UNIX域流式套接字的用法与TCP套接字基本一致,区别就在于使用的协议和地址不同。UNIX域流式套接字服务器器端流程以及示例代码如下。(1)创建UNIX域流式套接字。(2)将套接字文件描述符与本地信息结构体绑定。(3)设置监听模式。(4)接收客户端的连接请求。(5)发送、接收数据。 1 #include <stdio.h> 2 #include <arpa/i...原创 2019-07-05 19:47:06 · 368 阅读 · 0 评论 -
IP地址
IP地址用于区分同一个网络中的不同主机的唯一标识,Internet中的主机要与别的机器通信必须具有一个IP地址。每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由。IP地址为32位(IPV4,4个字节)或者128位(IPV6,16个字节)。通常使用点分十进制表示,例如:192.168.1.100。IP地址被分为了网络号和主机号两部分,网络号的位数直接决定了可以分配的...转载 2019-08-25 13:00:04 · 784 阅读 · 0 评论 -
套接字
套接字(socket)最早是由BSD在1982年引入的通信机制,目前已被广泛移植到主流的操作系统中。对于应用开发人员来说,套接字(socket)是一种特殊的I/O接口,也是一种文件描述符。socket是一种常用的进程之间通信机制,不仅能实现本地不同进程之间的通信,而且通过网络能够在不同主机的进程之间进行通信。对于网络通信而言,每一个socket都可用网络地址结构(协议、本地地址、本地端口)来表示...原创 2019-08-25 12:57:10 · 2457 阅读 · 0 评论 -
进程的状态与标识符
内核将所有进程存放在双向循环链表(进程链表)中,链表的节点都是task_struct,称为进程控制块的结构。该结构包含了与一个进程相关的所有信息,如进程的状态、进程的基本信息、进程标识符、内存相关信息、父进程相关信息、与进程相关的终端信息、当前工作目录、打开的文件信息、所接收的信号信息等。下面将详细阐述task_struct结构中最为重要的两个域:state(进程状态)和pid(进程标识符)。...原创 2019-08-18 10:53:50 · 1297 阅读 · 0 评论 -
僵尸进程
什么是僵尸进程,僵尸进程其实是进程的一种状态,即僵尸态。在3.1.3节中,介绍了僵尸态进程的形成。进程的僵尸态与死亡态很接近。唯一不同的是死亡态进程,即进程退出,释放所有资源;而僵尸态进程,即进程退出,但其资源没有得到释放。因此在实际的编程过程中,应尽量关注这一点,避免产生僵尸态的进程,因为僵尸态进程不执行任何任务,但却占有系统资源。如果僵尸态进程太多,则会导致系统浪费。下面将通过一个示例,展示僵...原创 2019-09-23 08:52:00 · 540 阅读 · 0 评论 -
文件系统的概念
在任何一个操作系统中,文件系统无疑是其最重要的组件,也是整个操作系统中,相对抽象的部分,理解的难度较大。文件系统是用于存放运行、维护系统所必须的各种工具软件、库文件、脚本、配置文件和其他特殊文件的地方,也可以安装各种软件包。简单通俗地说,就是用于组织和管理计算机存储设备上的大量文件的一种机制。文件系统的功能包括:管理和调度文件的存储空间,提供文件的逻辑结构、物理结构和存储方法;实现文件从标识到实...原创 2019-09-23 08:49:58 · 826 阅读 · 0 评论 -
文件系统的分类
Linux是一种兼容性很高的操作系统,支持的文件系统的格式很多,大体可以分为几类:(1)磁盘文件系统指本地主机中实际可以访问到文件系统,或者说可以驻留在磁盘上的文件系统,包括硬盘、CD-ROM、DVD、USB存储器、磁盘阵列等。常见文件系统格式有:EXT3、EXT4、VFAT、FAT、FAT16、FAT32、NTFS等;其中,NTFS是Windows目前主流的文件系统,作为电脑磁盘的主要文件系...原创 2019-09-09 08:53:04 · 5362 阅读 · 0 评论 -
守护进程的创建
Linux守护进程又被称为Daemon进程,为Linux的后台服务进程(即独立于控制终端)。该进程通常周期性的执行某种任务或等待处理某些发生的事件。其生命周期较长,通常在系统启动时开始执行,在系统关闭时终止。Linux中很多系统服务都是通过守护进程实现的。在Linux中,每一个从终端开始运行的进程都会依附于该终端(系统与用户进行交互的界面),这个终端称为进程的控制终端。当控制终端关闭时,这些进程...原创 2019-09-09 08:49:56 · 151 阅读 · 0 评论 -
字节序
字节序又称为主机字节序,是指计算机中多字节整型数据的存储方式。字节序有两种:大端(高位字节存储在低位地址,低位字节存储在高位地址)和小端(高位字节存储在高位地址,低位字节存储在低位地址)。在网络通信中,发送方和接收方有可能使用不同的字节序,为了保证数据接收后能正确的解析处理,统一规定:数据以高位字节优先顺序在网络上传输。因此数据在发送前和接收后都需要在主机字节序和网络字节序之间转换。一般主机的字...原创 2019-08-31 12:04:05 · 131 阅读 · 0 评论 -
OSI协议参考模型
网络体系结构指的是网络的分层结构和每层所使用协议的集合。通俗的说,即网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。每层实现的不同的功能。其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务。这其中最著名的体系结构为OSI协议参考模型。OSI是Open System Interconnection的缩写,意为开放式系统互联,它...原创 2019-08-31 11:59:28 · 266 阅读 · 0 评论 -
进程组与会话组
Linux系统中,进程是以组的形式(进程之间的层次关系)进行管理的。其中典型的例如,进程组和会话组。分别表示的是:进程组是一组相关进程的集合,会话是一组相关进程组或进程的集合。进程组ID其类型与进程ID一样。一个进程组有一个进程组首进程,也可称之为该进程组的组长,其进程ID为该进程组的ID。会话组是一组进程组或进程的集合。一个会话组有一个会话组首进程,也可称之为会话组组长。其进程ID为该会话组的...原创 2019-08-18 10:55:45 · 679 阅读 · 0 评论 -
UNIX域套接字
流式套接字与数据报套接字,除了可以完成网络通信,也可以完成本地通信。换句话说,即网络通信中,可以使用流式套接字与数据报套接字来完成。同样本地通信中,也可以使用流式套接字与数据报套接字来实现。 根据上述描述可知流式套接字和数据报套接字,既能实现网络通信,也能实现本地通信。通常把用于本地通信的套接字称为UNIX域套接字。 UNIX域套接字只能用于在同一个计算机的进程间通信。虽然网络套接字也可以用...原创 2019-07-05 19:41:06 · 661 阅读 · 0 评论 -
UDP组播的发送与接收代码示例
组播包的发送和接收依然是通过UDP套接字来实现。组播包发送的流程如下所示。(1)创建UDP套接字。(2)指定目标地址和端口。(3)发送数据包。 1 #include <stdio.h> 2 #include <arpa/inet.h> 3 #include <sys/types.h> 4 #include <sys/socket.h&...原创 2019-06-28 20:34:56 · 10431 阅读 · 0 评论 -
消息队列实现两个终端交互,模拟聊天
终端1代码如下,子进程发送消息,父进程接收消息。 1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/ipc.h> 4 #include <sys/msg.h> 5 #include <string.h> 6 #include <errn...原创 2019-05-17 18:35:01 · 1115 阅读 · 0 评论 -
一个简单的共享内存、信号灯代码案例
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/ipc.h> 4 #include <sys/shm.h> 5 #include <errno.h> 6 #include <sys/sem.h> 7 #include <...原创 2019-05-17 18:31:05 · 317 阅读 · 0 评论 -
一个简单的UDP编程示例(有注释)
服务器端的代码如下。 1 #include <stdio.h> 2 #include <arpa/inet.h> 3 #include <sys/types.h> 4 #include <sys/socket.h> 5 #include <netinet/in.h> 6 #include <string.h&...原创 2019-05-24 17:41:53 · 384 阅读 · 0 评论 -
一个简单的TCP编程示例
服务器端的代码如下所示。 1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/socket.h> 4 #include <string.h> 5 #include <netinet/in.h> 6 #include <arpa/inet....原创 2019-05-24 17:40:12 · 394 阅读 · 0 评论 -
线程池的实现
之前在很多博客中看到一个关于线程池的实现代码,完全一致,于是产生了一点兴趣,于是将代码进行了编译,吓死,全是错误,于是,进行了修改,并运行通过。(1)用户程序向任务队列中添加任务。(2)创建线程池,线程睡眠,处于空闲状态。(3)唤醒线程,线程池中的线程执行函数取出任务队列中的任务。(4)执行任务中的调用函数,完成工作。(5)线程池任务执行完判断,如果没有程序调用,线程继续睡眠。...转载 2019-05-07 09:36:20 · 154 阅读 · 0 评论 -
线程池的基本概念
多线程编程实现通信需要考虑数据的正确性。除此之外,多线程编程还需要考虑开销、性能的问题。于是在此时引出了线程的一种使用模式,叫做线程池。线程池,顾名思义,把一堆开辟好的 线程放在一个池子里统一管理,就是一个线程池。 之所以出现了线程池的概念,部分原因是考虑线程的频繁创建和销毁会消耗大量时间和资源。设想在一个传统的服务器中,有这样一种监听线程用来监听是否有新的用户连接服务器,每当有一...转载 2019-05-07 09:22:12 · 231 阅读 · 0 评论 -
进程内存布局
对于进程而言,Linux操作系统采用的是虚拟内存管理技术,这使得进程都拥有了独立的虚拟内存空间。该内存空间的大小为4G的线性虚拟空间,进程只需关注自己可以访问的虚拟地址,无需直到物理地址的映射情况。利用这种虚拟地址不但更安全(用户不能直接访问物理内存),而且用户程序可以使用比实际物理内存更大的地址空间。4GB的进程地址空间会被分成两个部分——用户空间与内核空间。用户地址空间是0~3GB(0xC0...翻译 2019-04-19 14:16:57 · 2931 阅读 · 0 评论 -
互斥锁死锁
互斥锁在默认属性的情况下使用,一般需要关注死锁的情况。所谓死锁,即互斥锁无法解除同时也无法加持,导致程序可能会无限阻塞的情况。有时,一个线程可能会同时访问多个不同的共享资源,而每个共享资源都需要有不同互斥锁管理。那么程序编写在不经意间极容易造成死锁的情况。造成死锁的原因有很多,本节将通过一些示例展示死锁的情况。(1)在互斥锁默认属性的情况下,在同一个线程中不允许对同一互斥锁连续进行加锁操作,因为...原创 2019-04-26 18:53:10 · 1137 阅读 · 0 评论 -
线程的分离
默认的情况下,线程是可连接的(也可称为结合态)。通俗的说,就是当线程退出时,其他线程可以通过调用pthread_join()获取其返回状态。但有时,在编程过程中,程序并不关心线程的返回状态,只是希望系统在线程终止时能够自动清理并移除。在这种情况下,可以调用pthread_detach()并向thread参数传入指定线程的标识符,将该线程标记为处于分离状态(分离态)。#include <pt...原创 2019-04-26 18:48:14 · 1238 阅读 · 0 评论 -
Wireshark显示封装信息
(1)Wireshark窗口界面介绍,如图8.32所示,是抓包后的窗口界面以及界面描述。(2)封包列表的面板上显示为:编号、时间戳、源地址、目标地址、协议、长度,以及封包信息。不同的协议会使用不同颜色。可以自行设置在View选项中的Color Rules中修改显示颜色的规则。(3)封包详细信息,是最重要的信息,用来查看协议中每一个字段。OSI七层模型分别为物理层、数据链路层、网络层、传输层、...转载 2019-05-31 18:37:28 · 2044 阅读 · 0 评论 -
TCP三次握手、四次挥手
使用TCP协议进行通信的流程,TCP协议为面向连接的,且具有可靠传输的协议。因此在实现数据收发之前需要建立连接。建立TCP连接、以及断开连接是一个较为复杂的过程。当建立一个TCP连接时,需要客户端和服务器端总共发送3个包以确认连接的建立,这个过程被称为“三次握手”。而当断开TCP连接时,需要客户端和服务器端总共发送4个包以确认连接的断开,这个过程被称为“四次挥手”。三次握手的过程如下。...转载 2019-05-31 18:40:17 · 189 阅读 · 0 评论 -
UDP组播概述
为了减少在广播中涉及的不必要的开销,可以只向特定的一部分接收方发送信息,这被称为组播(又称为多播)。当发送组播数据包时,只有加入指定多播组的主机数据链路层才会处理,其他主机在数据链路层会直接丢掉收到的数据包。如果将同时发给局域网中的所有主机称为广播,那么只是发给局域网中的部分主机称为组播。关于IP地址的分类。其中A类IP地址的范围:1.0.0.1到127.255.255.254;B类IP地...原创 2019-06-28 20:31:53 · 1950 阅读 · 0 评论 -
原始套接字概述
原始套接字(SOCK_RAW)不同于流式套接字、数据报套接字。原始套接字是基于IP数据包的编程,流式套接字只能收发TCP协议的数据,数据报套接字只能收发UDP协议的数据。前面讲述的网络编程都是在应用层收发数据,每个程序只能收到发给自己的数据,即每个程序只能收到来自该程序绑定的端口的数据。收到的数据往往只包括应用层数据,原有的头部信息在传递过程中被“隐藏”了。协议栈的原始套接字从实现上可以分为“链...转载 2019-07-12 18:50:16 · 1459 阅读 · 0 评论 -
UNIX域数据报套接字编程示例(本地通信)
UNIX域数据报套接字的流程可参考UDP套接字编程。其服务器端流程及代码示例如下所示。(1)创建UNIX域数据报套接字。(2)填充服务器本地信息结构体。(3)将套接字与服务器本地信息结构体绑定。(4)进行通信 (recvfrom/sendto)。 1 #include <stdio.h> 2 #include <arpa/inet.h> 3 #inclu...原创 2019-07-12 18:47:27 · 832 阅读 · 0 评论 -
UDP广播代码案例(测试自测)
广播的发送与接收通过UDP套接字来实现的。广播包发送的流程如下:(1)创建UDP套接字。(2)指定目标地址和端口(填充广播信息结构体)。(3)设置套接字选项允许发送广播包。(4)发送广播消息。发送广播包的示例代码如下所示。通过setsockopt()设置网络属性,允许进行广播。 1 #include <stdio.h> 2 #include <arpa/inet....原创 2019-06-21 17:06:14 · 1692 阅读 · 0 评论 -
UDP广播概述
网络信息传输主要有4种方式:单播、任播、组播、广播。在之前章节的介绍中,采用的都是单播(唯一的发送方和接收方)的方式。但实际很多时候,需要把数据同时发送给局域网中的所有主机。广播(与组播)可以为应用程序提供两种服务,包括数据分组发送至多个目的地,以及通过客户端请求发现服务器。发送到多个目的地,指的是应用程序将信息发送至多个收件方。例如,邮件或新闻分发给多个收件方。如果没有广播(或组播)这些...转载 2019-06-21 17:00:38 · 1659 阅读 · 0 评论 -
并发服务器(TCP-fork)
为了提高服务器的并发处理能力,在这里又引入了并发服务器的模型。并发服务器解决了循环服务器的缺陷,即可以在同一时刻响应多个客户端的请求。其基本设计思想是在服务器端采用多任务机制(即多进程或多线程),分别为每一个客户端创建一个任务处理。也可以使用select函数实现并发服务器。首先介绍使用父子进程实现并发服务器(多线程与之类似),具体设计细节为由子进程来处理客户端的消息,而父进程接收客户端的连接请求...原创 2019-06-14 18:23:02 · 882 阅读 · 0 评论 -
循环服务器(TCP)
在网络通信中,服务器通常需要处理多个客户端。由于多个客户端的请求可能会同时到来,服务器端可采用不同的方式来处理。目前最常用的服务器模型为循环服务器模型与并发服务器模型。循环服务器模型是指服务器端依次处理每个客户端,直到当前客户端的所有请求处理完毕,在处理下一个客户端。此类模型的特点就是简单,但也容易造成除当前客户端以外的其他客户端等待时间过长的情况。循环服务器的实现其实很简单,通常可以采用循环...原创 2019-06-14 18:18:42 · 2064 阅读 · 0 评论