Linux
根号二点五
胜天半子
展开
-
文件操作【文件流指针、文件描述符】
C语言文件操作(文件流指针)打开文件(fopen)FILE* fopen(const char* path, const char* mode)path: 需要打开文件的路径加上文件名称,可以不加路径,则默认打开当前路径下的文件mode: 打开方式r: 以读方式打开,如果文件不存在则报错r+: 以读写方式打开,如果文件不存在则报错w: 以读方式打开,如果文件不存在则创建,存在则将文件截断,即清空当前内容,文件流指针指向文件头部w+: 以读写方式打开,如果文件不存在则创建,存在则将文件截断原创 2020-10-08 13:49:37 · 401 阅读 · 0 评论 -
minishell【模拟 shell 基本功能】
思路从标准输入当中读取数据(要执行的可执行程序)(fgets)拆分可执行程序名称和命令行参数,标准输入当中读取到的内容第一个空格之前的数据是可执行程序名称,之后都为命令行参数(isspace)创建子进程,子进程程序替换可执行程序(fork)在子进程程序替换时间内,让父进程进行进程等待(execvp、waitpid)代码实现minishell.c#include <stdio.h>#include <string.h>#include <ctype.h>原创 2020-10-08 12:40:28 · 334 阅读 · 1 评论 -
进程程序替换(原理及exec 函数簇)
原理替换代码段和数据段,从磁盘加载新的代码段和数据段到物理内存,用页表映射回进程虚拟地址空间的代码段、数据段,同时应该将堆栈、命令行参数等变为最初状态,pid 不变、环境变量不变、应用exec 函数簇:多个 ecec 结构的函数int execl(const char* path, const char* arg,...)path: 带路径的可执行程序,绝对或相对路径arg: 给可执行程序传递的参数,规定:第一个参数必须是可执行程序的名称...: 可变参数列表,参数列表要以 NULL 标志参数原创 2020-10-08 12:18:45 · 325 阅读 · 0 评论 -
【小练习】shell 程序设计 读取一个整数n,输出斐波那契数列的前n项及它们的和
这里就是简单的shell程序,没有进行输入判断,可以先判断输入是否为数再进行运算#!/bin/bashread -p " > " var1a=1b=1c=0s=0for((i=0;i<$var1;++i));doecho "$a"((s+=a))((c=a+b))((a=b))((b=c))doneecho "sum=$s"原创 2020-08-26 21:02:33 · 1619 阅读 · 0 评论 -
【项目】畅聊系统
描述采用网络编程技术,结合 cs 模型,完成一个微型 QQ 群聊系统技术特点C++ STL、生产者消费者模型、多线程技术、线程的同步与互斥、网络编程、开源jsoncpp库、ncurses库、自定义协议、登录注册认证原理登录聊天思路项目目录结构项目模块编写 UDP Server 服务器 / UDP Client 客户端,使之互相通信,完成基本网络通信功能定制登录注册协议格式//不考虑大小端struct RegisterInfo{ char nick_name[32];原创 2020-07-22 15:48:11 · 259 阅读 · 0 评论 -
【网络编程套接字】IP地址 & 端口 & TCP 及 UDP 协议实现
IP地址作用:在网络当中唯一标识一台主机本质:IPV4:unit32_t 类型的值,最大的范围是 42 亿多,采用点分十进制来表示 IP 地址(例:172.16.99.129),每一个字节能表示的最大数据为 255目的 IP 地址:标识数据去向源 IP 地址:标识数据来向IPV6:16个字节的整数,128 位的无符号整型数据,IPV6 天然不向下兼容 IPV4...原创 2020-03-14 18:00:50 · 626 阅读 · 0 评论 -
【读写锁】特性、接口及常见问题分析
读写锁适用的场景少量写的线程 + 大量读的线程读写锁和互斥锁很相似,但是读写锁允许读的并行读写锁的三种状态读模式的加锁状态写模式的加锁状态不加锁的状态加锁规则一次只有一个线程可以占有写模式的读写锁,不能同时写,但能同时读,即一个执行流进行写的时候,其他执行流既不能写也不能读,一个执行流进行读的时候,其他执行流可以读,但是不能写多个线程可以同时去占有读模式的读写锁,在读写锁的内...原创 2020-03-03 20:54:44 · 299 阅读 · 0 评论 -
互斥锁(使用过程及应用场景)
互斥锁使用流程定义互斥锁变量pthread_mutex_t:互斥锁变量的类型 例:pthread_mutex_t mutex初始化互斥锁变量int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr); muter:互斥锁变量,传参数的时候,传入互斥锁变量的地址 at...原创 2020-02-24 12:02:44 · 1563 阅读 · 0 评论 -
线程 概念、特性及常见问题分析
线程概念线程在 Linux 操作系统中就是一个执行流,不同的执行流可以拥有不同的 CPU 来进行运算,即不同的的执行流之间可能会有并行的情况产生,这种并发的场景下,不同执行流访问资源可能会导致程序异常,这种情况为线程安全创建一个线程,也是在内核当中创建出来一个 PCB,但是这个 PCB 当中的内存指针,是指向进程的虚拟地址空间问题:都指向了同一个虚拟地址空间,这个和 vfork 创建子进程有...原创 2020-02-21 16:32:53 · 453 阅读 · 0 评论 -
竞态条件 一二事
竞态条件如果程序运行顺序的改变会影响最终结果,这种情况即竞态条件,即程序的不同执行流,执行顺序的不同,导致程序运行结果不同导致竞态条件发生的代码区称作临界区。在临界区中使用适当的同步就可以避免竞态条件关于临界区、临界资源的分析可见另一篇博客重入先看一下下面的实例:有两个PCB(p1,p2)分别要对一个全局变量 val = 10 进行 – 的操作,正常情况下结果应该是 8 ,但在临界资源...原创 2020-02-20 18:00:28 · 193 阅读 · 0 评论 -
进程信号的概念、产生及实现(注册、注销、处理、捕捉、阻塞)分析
先思考两个问题:进程创建出的子进程,有可能在子进程退出时产生一个僵尸进程,是由于子进程退出时,父进程来不及回收子进程的退出信息,导致子进程成为僵尸进程,为什么父进程来不及回收子进程的退出信息?从信号角度理解,为什么进程等待就可以解决僵尸进程?信号基本概念信号是进程之间事件异步通知的一种方式,属于软中断,即打断正在运行的进程,使之去处理信号的事件信号种类Linux中有62种信号:1-3...原创 2020-02-19 13:45:43 · 467 阅读 · 0 评论 -
信号量实现 同步&互斥 分析
信号量作用实现进程控制,实现进程的同步与互斥本质本质是一个计数器 + PCB等待队列计数器对资源的计数进行加1或减1操作实现互斥同步互斥:不同的进程,在同一时刻,只能有一个进程对临界资源进行访问同步:保证进程对临界资源访问的合理性实例分析互斥的实现是由于计数器初始化时设置为 1,即信号量表示仅 1 个资源可用,仅 1 个进程可访问临界资源现在有进程 A 和 B 对临界资源进行...原创 2020-02-18 13:52:28 · 497 阅读 · 0 评论 -
消息队列 分析及运用
消息队列概念消息队列特性为先进先出,底层实现是链表,在内核中创建,有一个消息队列的标识符来表示,这个队列当中的每一个元素都有自己的类型,每一个类型都有一个优先级概念属性消息队列在操作系统属性msgmax:每一个节点最大消息的发送字节数为8 kmsgmnb:队列中所有消息的长度之和 为 16 kmsgmni:系统当中最大的队列数为 2 k图解使用创建 int msgge...原创 2020-02-18 12:53:15 · 326 阅读 · 0 评论 -
临界资源的同步与互斥,区分临界资源与临界区,二义性分析
描述互斥:同一时间,当只保证互斥,则可以保证临界资源访问不会造成临界资源数据的二义性,但是有可能占有临界资源的进程一直在占有,导致后面进程访问等待时间比较长同步:保证对临界资源访问的合理性1. 互斥如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入,保证只能有一个进程访问临界资源任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必...原创 2020-02-17 16:22:47 · 3050 阅读 · 0 评论 -
共享内存 system V共享 分析与实现
system V共享共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据共享内存示意图共享内存数据结构struct shmid_ds { struct ipc_perm shm_perm; /* operation perms */ int shm_segs...原创 2020-02-17 15:52:06 · 245 阅读 · 0 评论 -
匿名管道 & 命名管道 分析及应用
定义管道是Unix中最古老的进程间通信的形式我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”匿名管道创建无名管道原型int pipe(int fd[2]);参数fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端返回值:成功返回0,失败返回错误代码用fork来解释管道共享父进程原有的管道经过 fork 产生的子进程共用管道,读端写端都复制,for...原创 2020-02-16 22:56:35 · 306 阅读 · 0 评论 -
文件描述符 & 文件流指针 区别与联系
文件描述符文件描述符:指的是 fd_array 数组的下标, fd_array 数组中的元素都是一个 sturct file,每一个 struct file 中存储了文件名、创建时间、修改时间、打开时间等信息fd_array 数组中的分配规则:最小未占用原则,即数组下标越小越先分配1.文件流指针是封装文件描述符的,文件流指针底层的 _IO_FILE 结构体当中,保存了文件描述符 _file...原创 2020-02-15 22:39:48 · 1412 阅读 · 0 评论 -
静态库 & 动态库 实现与区别
静态库(.a)程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库, Windows下(.lib)动态库(.so)程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码, Windows下(.dll)静态库实现生成:ar -rc lib[file...原创 2020-02-15 10:24:10 · 211 阅读 · 0 评论