linux系统编程
文章平均质量分 58
CC_YXK
这个作者很懒,什么都没留下…
展开
-
项目--编写bash及常见命令的代码实现
一、项目概述 在linux终端下我们可以看到用户的相关信息和主机信息等,并且在终端下,可以操作很多的命令(ls、ps、pwd等),并且在终端下可以运行自己的程序。因此本项目实现以下功能:打印用户、主机等相关信息 可以在mybash中操作相关命令 各种命令的代码实现二、显示信息Linux系统下,打开一个终端后会出现以下界面,其中包括用户信息、主机信息和当前位置信息,首先实现这...原创 2018-08-06 12:55:25 · 1327 阅读 · 2 评论 -
信号量
一、基本概念 使用信号量之前必须先清楚临界资源和临界区的概念。临界资源就是同一时刻只允许一个进程访问的资源(软件或硬件资源)。临界区就是访问临界资源的代码段。 信号量是一种特殊的变量,用来控制对临界资源的使用,在多个进程或线程都要访问临界资源的时候,就需要控制多个进程或线程对临界资源的使用,因为临界资源同一时刻只允许一个进程访问。 信号量机制通过p、v操作实...原创 2018-09-12 08:12:00 · 642 阅读 · 0 评论 -
共享内存
一、定义 共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。共享内存的具体实现是不同进程共享的内存安排为同一段物理地址。 如上图所示,进程A和进程B共享同一块物理内存,共享内存中的数据进程A和进程B均可进行相关操作,这样便可达到两个进程之间数据传递的目的。二、相关函数1、shm函数(创建共享内存)函数声明:int shmget(key_t ey,...原创 2018-09-19 15:38:10 · 3726 阅读 · 0 评论 -
消息队列
一、概念 消息队列提供了一个进程向另一个进程发送数据块的机制。由于利用消息队列传递的是数据块,那么数据块就有其数据类型和大小限制,接受进程可以独立的接收不同类型的数据,但也存在发送数据大小的上限,系统总消息队列的个数也是有限的。二、相关函数1、msgget函数:用于创建一个消息队列int msgget(key_t key, int msgflg);第一个参数:键值,即该消息队...原创 2018-09-20 10:18:43 · 133 阅读 · 0 评论 -
TCP头部结构详解
tcp头部信息出现在每个tcp报文段中,用于指定通信的源端端口,目的端口,管理tcp连接等。tcp头部结构如下图所示: tcp头部结构1、16位端口号:告知主机该报文段来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的。进行tcp通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号。2、32位序号:一次tcp通信过程中某一个传输方向上的字节流的每...原创 2018-10-15 15:06:45 · 11228 阅读 · 0 评论 -
I/O函数复用 -- epoll
内核事件表epoll函数是linux特有的I/O复用函数。它再在实现和使用上与select、poll有一下差异:epoll使用一组函数来完成任务,而不是单个函数 epoll把用户关心的文件描述符上的事件放在内核的一个事件表中,从而无需像select和poll那样每次调用都要重复传入文件描述符集或事件集。epoll需要使用一个额外的文件描述符,来唯一标识内核中的这个事件表。这个文件描述符...原创 2018-10-29 14:15:36 · 140 阅读 · 0 评论 -
select、poll、epoll的比较
select、poll、epoll都能同时监听多个文件描述符。它们将等待指定时间,直到一个或多个文件描述符上有时间发生时返回,返回值是就绪的文件描述符数量。返回0表示没有事件发生。select、poll和epoll的不同主要体现在以下三个方面:1、向内核传递描述符select 每轮循环都要重新拷贝到内核空间 poll 每轮循环都要重新拷贝到内核空间 epoll 每...原创 2018-10-29 14:44:38 · 99 阅读 · 0 评论 -
I/O函数复用 -- select
select系统调用的用途是:在一段指定时间内,监听用户感兴趣的文件描述符上的可读、可写和异常事件。select APIselect函数原型如下:# include<stdio.h>int select(int nfds, fd_set* readfds, fd_set* wtitefds, fd_set* exceptfds, struct timeval* time...原创 2018-10-30 09:47:58 · 121 阅读 · 0 评论 -
TCP连接为什么是三次握手
首先我们来回顾一下tcp建立连接的过程1、为什么不是2次握手呢?防止客户端失效的连接请求报文段突然又传到服务器例如以下情况如果使用两次握手:如果客户端向服务器发送第一次连接请求在网络节点上滞留了,没有收到服务器的确认,于是又重新发送了一次连接请求 服务器收到客户端的第二次请求发送确认,则连接建立完成 服务器客户端进行数据传输,传输完成断开连接。 此时,在网络上滞留的客户端...原创 2019-02-22 16:48:48 · 735 阅读 · 0 评论 -
写时拷贝技术
写时拷贝的主要思想是在复制原来实体的时候,如果复制后的实体不需要进行改变,那么实际上没必要进行实体内容的拷贝,只需建立一个引用指向原来的实体内存,直接应用原来的实体内容即可,只有当需要对复制后的实体进行修改的时候才进行内容的拷贝。 写时拷贝技术在很多方面都有应用,典型的有:C++中的写时拷贝技术 Linux中的写时拷贝技术一、C++中的写时拷贝技术 ...原创 2019-02-22 19:56:20 · 370 阅读 · 0 评论 -
ARP协议
一、ARP协议工作原理 ARP协议能实现任意网络地址到任意物理地址的转换,其工作原理是:主机向自己所在的网络广播一个ARP请求,该请求包含目标主机的网络地址,此网络上的其他机器都受到这个请求,但只有被请求的目标机器回回应一个ARP应答,其中包含自己的物理地址。二、以太网ARP请求/应答报文详解以太网ARP请求/应答报文格式如下:硬件类型字段定义物理地址类型,它的值为1表示...原创 2018-09-06 11:51:33 · 461 阅读 · 0 评论 -
信号
一、信号的初步认识1、特点简单 携带的信息量少 使用在某个特定的场景中2、信号的状态产生 键盘:ctrl + c 命令:kill 系统函数:kill 软条件:定时器 硬件:段错误,除0错误 未决状态 -- 没有被处理 递达 - 信号被处理了 忽略 捕捉 执行了默认动作 3、阻塞信号集、未决信号集 阻塞信号集合未决信号集在pcb中,...原创 2018-08-08 11:24:53 · 276 阅读 · 1 评论 -
vi和其他常见命令
vi是Linux上的文本编辑器 1、vi 有三种模式 命令模式 编辑模式(插入模式) 末行模式2、模式之间的转换命令模式-->编辑模式:"i a o I A O" 编辑模式-->命令模式:"esc" 命令模式-->末行模式:": / ?"3、命令模式常用操作复制 (1)yy 复制一行 (...原创 2018-08-06 15:58:17 · 166 阅读 · 0 评论 -
内存映射区
1、mmap - 创建内存映射区作用:将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件 函数原型:void *mmap( void *adrr, //映射区首地址,传NULL size_t length, //映射区的大小,不能为0,文件多大,length多大 int port, //映射区权限,PORT_EXEC、 ...原创 2018-08-04 10:54:03 · 1215 阅读 · 0 评论 -
管道
1、管道的概念本质:内核缓冲区,打开管道时会在内存中分配一块空间 伪文件--不占用磁盘空间特点:两部分:读端,写端,对应两个文件描述符 数据写端流入,读端流出 操作管道的进程被销毁之后,管道自动被释放 管道只读或只写打开时会阻塞。需要两个进程同时打开,一个读,一个写。 当写端关闭时,读端不会阻塞管道的原理:内部实现方式:队列(环形队列)。 管道中有头指针:负责写。...原创 2018-08-03 17:21:40 · 504 阅读 · 0 评论 -
进程回收
1、孤儿进程父进程创建子进程 父进程先死,子进程还活着,子进程叫孤儿进程 孤儿进程被init进程领养,init进程变为该孤儿进程的父进程 为了释放子进程占用系统资源:进程结束之后,能够释放用户区空间,但是释放不了pcb,必须由父进程释放2、僵尸进程父进程创建子进程 子进程死了,父进程活着。 父进程不去释放子进程的pcb 子进程变为僵尸进程 僵尸进程是一个已经死掉的进程3、...原创 2018-08-02 15:02:45 · 306 阅读 · 0 评论 -
exec函数族
1、exec函数族作用让父子进程执行不相干的操作。 能够替换进程地址空间中的源代码.txt段 当前程序中调用另外一个应用程序(首先想到exec之前需要fork) 返回值:如果函数执行成功,不返回,执行失败,打印错误信息,退出当前进程2、exec库函数execl(默认传递了环境变量)函数原型如下:int execl(const char *path, const char *...原创 2018-08-02 11:41:40 · 348 阅读 · 0 评论 -
复制进程
1、父子进程 如果B进程是由A进程复制而来,我们将A进程称为父进程,B进程称为子进程。子进程相当于是对父进程的一个拷贝。 父子进程除了pid(进程id)外完全相同。2、fork函数 函数原型:int fork(void);fork函数有两个返回值,因为在进程拷贝过程中父进程调用fork函数,而子进程拥有和父进程完全相同的代码段,所以子进程中也包括fork函...原创 2018-08-01 13:50:05 · 1189 阅读 · 0 评论 -
扫描目录
对于目录的操作也类似于文件操作,通过一些库函数即可对目录进行扫描1、opendir函数opendir函数的作用是打开一个目录并建立一个目录流。如果成功,它返回一个指向DIR结构的指针,该指针用于读取目录数据项。函数原型如下:# include <sys/types.h># include <dirent.h>DIR *openrir(const ch...原创 2018-07-31 10:05:00 · 860 阅读 · 0 评论 -
文件和目录的维护
标准库和系统调用为文件和目录的创建与维护提供了全面的支持。1、chmod系统调用chmod系统调用用来改变文件或目录的访问权限函数原型# include <sys/stat.h>int chmod(const char *path,mode_t mode);path:文件路径mode:修改后的权限除非程序被赋予适当的特权,否则只有文件的属主或超级管理员...原创 2018-07-30 20:12:01 · 310 阅读 · 0 评论 -
标准I/O库
1、fopen函数fopen打开由filename参数指定的文件,并把它与一个文件流关联起来,mode参数指定文件的打开方式,它取下列字符串中的值:"r"或"rb":以只读方式打开 "w"或"wb":以写方式打开,并把文件长度截短为0 "a"或"ab":以写方式打开,新内容追加在文件尾 "r+"或"rb+"或"r+b"原创 2018-07-30 14:23:14 · 127 阅读 · 0 评论 -
系统调用:write、open、read
一、open 简单来说,open建立了一条到文件或设备的访问路径。如果调用成功,它则返回一个可以被read、write和其他系统调用使用的文件描述符。这个文件描述符是惟一的,它不会与其他任何运行中的进程共享,如果两个程序同时打开同一个文件,他们会分别得到两个不同的文件描述符。如果他们都对文件进行写操作,那么它们会各写各的,它们分别接着上次离开的位置继续往下写。它们的数据不会交织在一起,...原创 2018-07-30 11:27:29 · 1406 阅读 · 0 评论 -
线程同步的方法有哪些?
一、线程同步和线程互斥首先我们要清楚什么是线程同步和线程互斥:1、线程同步:线程同步指的是多个线程之间协调同步,按照预定的先后次序进行运行,这种先后次序取决于要完成的特定任务,最基本的场景就是:A线程要完成的任务依赖于B线程的数据。2、线程互斥:线程互斥是指对于线程共享的线程资源,在各个线程访问时具有排它性。当有若干个线程要访问同一共享资源时,任何时刻只允许一个线程进行访问,直到占有资源...原创 2019-02-26 20:41:00 · 6426 阅读 · 0 评论