
Linux
文章平均质量分 61
Learning is never out of date
code-016
有问题请私信,停更一段时间。
展开
-
【Linux】bash命令解析器的实现
文章目录(一)bash流程框架图:(二)(一)bash流程框架图:(二)原创 2021-12-10 21:36:09 · 893 阅读 · 0 评论 -
【Linux】进程替换
文章目录(一)进程替换(二)环境变量(三)进程替换API`(unistd.h)`(1)系统调用API(2)库函数API(四)进程替换和fork的结合使用案例(五)进程替换测试(六)进程替换API总结(一)进程替换进程替换不会创建新的进程,进程PCB未发生改变,进程实体(数据代码内容)被替换进程替换成功后不会执行替换函数下的代码,失败后会执行进程替换成功不返回,失败后返回-1(二)环境变量环境变量的作用:当使用shell来运行一个程序时,若没有加绝对路径,系统先会在当前路径下寻找该程原创 2021-12-10 00:44:16 · 712 阅读 · 0 评论 -
【Linux】系统调用与库函数
文章目录(一)系统调用和库函数(二)用户空间和内核空间(三)当调用系统调用都发生了什么??(四)printf库函数和write系统调用(一)系统调用和库函数概念:系统调用:在内核空间中实现的函数,内核空间中执行(内核态)库函数:在函数库中实现的函数,用户空间执行(用户态)(二)用户空间和内核空间(三)当调用系统调用都发生了什么??当一个进程在用户空间执行系统调用时,将系统调用号写入eax寄存器并触发0x80中断,此时系统对该程序进行现场保护,CPU停止执行该进程用户空间的代码,进程会..原创 2021-12-09 15:26:48 · 842 阅读 · 0 评论 -
【Linux】HTTP协议
文章目录(一)HTTP协议(二)HTTP请求(1)HTTP请求的部分内容(2)请求方法(三)HTTP应答(1) HTTP应答的部分内容(2)应答状态码(四)Cookie作用(五)简单使用HTTP协议(1)一个简单的HTTP服务器(一)HTTP协议HTTP:超文本传输协议,一种应用层的数据传输协议我们今天简单了解下http协议,我们像浏览器的地址栏输入www.baidu.com会发生什么呢?下面是大致的流程(二)HTTP请求(1)HTTP请求的部分内容GET http://www.baidu原创 2021-12-02 16:07:23 · 2659 阅读 · 0 评论 -
【Linux】UDP协议实现C/S模式
(一)实现流程(二)代码实现(1)服务器端#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <unistd.h>void udp_ser(){ int sockfd = socket(A原创 2021-12-02 12:05:51 · 1218 阅读 · 1 评论 -
【Linux】UDP协议的数据读写API
(一)UDP协议的数据读写API头文件:sys/types.hsys/socket.h(1)sendto 发送数据ssize_t sendto(int sockfd, const void* buf, size_t len, int flags, const struct sockaddr* des_addr, socklen_t addlen);sockfd : 套接字描述符buf : 存放要发的数据len : 数据buff的长度flags : 默认0,标志位des_addr : 存原创 2021-12-02 11:47:48 · 1589 阅读 · 1 评论 -
【Linux】TCP协议实现C/S模式
(一)简单C/S模型(1)服务器端代码:#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <string.h>#include <stdlib.h>#include <netinet/in.h>#include <sys/socket.h>#include <arpa/inet.h>void Server()原创 2021-12-01 19:57:39 · 1292 阅读 · 0 评论 -
【Linux】TCP协议的数据读写API
文章目录(一)引入recv、send系统调用(1)接收数据recv(2)发送数据send(一)引入recv、send系统调用虽然文件读写操作系统调用的read、write也可以用在socket的数据读写中,但是对数据读写的控制不如recv、send系统调用;下面就来介绍下TCP流数据读写的系统调用:头文件:sys/types.hsys/socket.h(1)接收数据recvssize_t recv(int sockfd, void* buf, size_t len, int flags);原创 2021-12-01 19:42:57 · 1016 阅读 · 0 评论 -
【Linux】socket地址、IP地址、Port端口转换
(一)通用socket地址(1)struct sockaddrstruct socketaddr类型是网络编程的通用地址类型,其定义如下头文件:bits/socket.h#include <bits/socket.h>struct sockaddr{ sa_family_t sa_family; //地址族(协议族)类型的变量 char sa_data[14]; //存放socket地址值};协议族和地址族的关系注意:宏PF_*和AF_*都定义在bits/soc原创 2021-11-30 15:08:32 · 4773 阅读 · 1 评论 -
【Linux】主机字节序和网络字节序
(一)问题提出:为什么要有主机字节序和网络字节序的存在?现在大多数PC机器都是小端字节序(小端存储),也称为主机字节序;但不排除有大端PC机器的存在。若在两台字节序不同的主机上传输数据时,接收端将会错误解释。例如:小端主机发送0x0001(2字节的十进制数据1)给大端机器接收到并处理之后的数据就是0x0100(2字节十进制数据256),很明显数据输出被错误的解释。所以解决问题的方法:发送端总是把发送的数据转化成大端字节序(网络字节序)后再发送,接收端知道对方的数据采用大端字节序,接收端根据原创 2021-11-30 11:52:53 · 1124 阅读 · 0 评论 -
【Linux】多线程中fork与互斥锁
文章目录问题提出:(一)初次尝试(二)理性分析(三)解决问题(1)使用pthread_join()(2)使用phread_atfork()注册一个fork之前的判断问题提出:我们有这样一个问题:在一个多线程程序中创建子进程并且让子线程和子进程去获取一把全局变量的锁,输出子线程得到锁,然后解锁,子进程拿到锁,然后解锁;(一)初次尝试代码:#include <stdio.h>#include <unistd.h>#include <pthread.h>#i原创 2021-11-29 20:48:26 · 1082 阅读 · 2 评论 -
【Linux】多线程中的fork
文章目录问题提出:情况(1)fork在创建子线程之前情况(2)fork在创建子线程之后情况(3)子线程中的fork结论:问题提出:回想一下:当一个程序只有主线程的时候调用fork,此时fork会创建出的子进程也会只有一条线程;那要是把fork放入多线程的程序中呢?我们来试验下:情况(1)fork在创建子线程之前代码:#include <stdio.h>#include <pthread.h>#include <unistd.h>void* p原创 2021-11-29 17:55:20 · 839 阅读 · 0 评论 -
【Linux】进程线程的命令及最大线程个数问题
文章目录(一)查看进程/线程的命令`ps -eLf`(二)跟踪进程/线程系统调用情况(1)正在运行的程序:`strace -p 进程/线程号`(2)未运行的程序`strace 可执行文件名`(三)跟踪库函数调用ltrace(1)正在运行的程序`ltrace - p 进程号/线程号`(2)未运行的程序`ltrace 可执行文件名`(四)Linux系统一个进程最多可以创建多少个线程(五)代码测试最大的线程数(一)查看进程/线程的命令ps -eLfL:显示线程id(二)跟踪进程/线程系统调用情况(1)正原创 2021-11-29 16:44:51 · 546 阅读 · 0 评论 -
【Linux】线程同步(条件变量)
文章目录(一)条件变量(二)条件变量的相关接口(三)简单使用条件变量(一)条件变量条件变量提供一种线程间通知机制,当某个共享数据到达一定条件时,会唤醒等待(阻塞的)得到这个共享数据的线程条件变量与互斥锁结合使用,对临界区资源加锁进行控制的基础上,当条件变量满足条件,会唤醒该线程;执行完毕后解锁;(二)条件变量的相关接口头文件: pthread.h(1)初始化条件变量int pthread_cond_init(pthread_cond_t* cond, pthread_condattr_t*原创 2021-11-28 16:33:45 · 632 阅读 · 1 评论 -
【Linux】线程同步(读写锁)
(一)读写锁加上读写权限的一种锁(自旋锁),写锁独占,读锁共享加写锁的时候,该线程独占cpu,其他线程访问写锁的区域时都将会被阻塞加读锁的时候,其他线程都可以被调度,但是写入操作会阻塞(二)读写锁的三种关系(1)读与读之间没有关系(2)写与写是互斥关系(3)读和写是同步互斥关系同步:读和写在同时竞争锁的时候,写会优先得到锁互斥:读的时候写阻塞,写的时候读阻塞(三)读写锁的相关接口头文件:pthread.h(1)读写锁初始化int pthread_rwlock_init(原创 2021-11-28 12:09:24 · 309 阅读 · 0 评论 -
【Linux】线程同步(互斥锁)
文章目录(一)互斥锁(二)互斥锁的调用接口(三)互斥锁的简单使用(一)互斥锁互斥锁(互斥量):允许程序员锁住某个对象,使得的每次只有一个线程访问它。为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,在完成关键代码执行后解锁。(二)互斥锁的调用接口头文件:pthread.h依赖pthread线程库(1)初始化锁int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* mutexattr);原创 2021-11-28 10:48:23 · 481 阅读 · 0 评论 -
【Linux】线程安全strtok与strtok_r
文章目录(一)问题:多线程中strtok时出现非正常情况解决方案:使用strtok_rstrtok是字符串分割函数strtok_r是strtok的线程安全版本(一)问题:多线程中strtok时出现非正常情况代码:#include <string.h>#include <stdio.h>#include <pthread.h>void* pthread_fun(void* arg){ char bbuff[] = {"a b c d e"};原创 2021-11-27 21:46:01 · 707 阅读 · 1 评论 -
【Linux】线程同步(信号量)
文章目录(一)问题描述(1)未同步(异步)多线程代码(二)信号量控制线程同步(1)同步多线程代码我们简单写个多个线程并发对一个全局变量进行++操作(一)问题描述创建5个线程,一个全局变量gdata = 0; 让每个线程都对gdata进行++100次,理想结果就是499(1)未同步(异步)多线程代码代码#include <stdio.h>#include <string.h>#include <pthread.h>int gdata = 0;v原创 2021-11-27 19:55:33 · 560 阅读 · 0 评论 -
【Linux】线程库API详情
文章目录线程库接口介绍:(一)创建线程(二)退出线程(三)等待线程退出(未退出会阻塞)(四)简单使用线程库接口介绍:依赖头文件:pthread.h编译程序时,需要使用 -lpthread链接线程库(一)创建线程int pthread_create(pthread_t* thread, pthread_attr_t* attr, void* (*start_routine)(void*), void* arg);thread : pthread_t* 类型的变量的地址,将该变量作为新线程的标识符原创 2021-11-27 16:24:42 · 384 阅读 · 1 评论 -
【Linux】线程概述
文章目录引言:(一)进程和线程的区别(二)线程的优缺点(1)优点(2) 缺点(三)线程的实现方式(1)内核级线程(2)用户级线程(3)组合级线程引言:线程:一个程序中的多条执行路线就叫做线程(thread);线程是一个进程内部的一个控制序列;每个进程至少都一个线程,一个进程可以有多个线程参考文章:https://zhuanlan.zhihu.com/p/111553897(一)进程和线程的区别进程是资源分配的最小单位,线程是CPU调度的最小单位进程有独立的地址空间,线程共原创 2021-11-27 15:11:11 · 557 阅读 · 0 评论 -
【Linux】查看已被占用端口号
我们不能使用小于1024的端口号,这些端口号是为系统调用保留的。我们可以通过查看/etc/services文件来确定一个端口号及其对应的服务cat /etc/services结果:常见的端口号如下:原创 2021-11-27 12:06:00 · 723 阅读 · 0 评论 -
【Linux】文件系统的套接字简单使用
简单使用AF_UNIX本地连接AF_UNIX:本地连接实现ser和cli之间的通信服务器ser.c#include <stdio.h>#include <sys/un.h>#include <sys/socket.h>#include <string.h>#include <unistd.h>void server(){ int sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if(s原创 2021-11-27 11:36:22 · 606 阅读 · 0 评论 -
【Linux】套接字相关接口详解
文章目录套接字相关接口(一)创建套接字socket(二)套接字地址(三)命名套接字bind套接字相关接口(一)创建套接字socketsocket系统调用创建一个套接字并返回一个文件描述符,使用该文件描述符可以访问该套接字。头文件:sys/types.h sys/socket.hint socket(int domain, int type, int protocol);domain : 指定协议族域说明AF_UNIXUNIX域协议(文件系统套接字)AF_原创 2021-11-27 11:20:18 · 1112 阅读 · 2 评论 -
【Linux】初识套接字
文章目录前言(一)套接字(1)认识套接字(2)套接字的属性1. 套接字的域2. 套接字类型3. 套接字协议前言套接字接口 : 类似于管道的用法套接字用途:同一台计算机的进程通信支持分布在网络中的客户端/服务器之间通信(一)套接字(1)认识套接字一种通信机制可以实现本机/跨网络通信套接字的创建和使用不同于管道套接字支持多个客户端连接同一个服务器(2)套接字的属性1. 套接字的域域指定套接字的使用的网络介质常用的是AF_INET,指的就是Internet(网际协议(原创 2021-11-26 22:27:19 · 448 阅读 · 0 评论 -
【Linux】进程通信(消息队列Message Queue)
文章目录(一)消息队列(1)消息队列原理(2)Linux系统下的两个宏定义:(其它系统未知)(二)消息队列函数(1)创建,访问一个消息队列(2)添加消息到队列中(3)从消息队列中获取消息(一)消息队列消息队列与有名管道相似消息队列不需要管道的打开和关闭管道的操作消息队列并未解决管道满时的阻塞问题(1)消息队列原理一个进程向另一个进程发送一个数据块(含有类型)接收进程可以独立地接收不同类型的数据块可以避免有名管道的同步和阻塞问题(未满状态)可以查看紧急消息每个数据块都有一个最大原创 2021-11-26 10:37:22 · 1513 阅读 · 0 评论 -
【Linux】进程通信(共享内存Shared Memory)
文章目录(一)共享内存(1)共享内存实现进程间通信的原理:(2)共享内存逻辑结构图(二)共享内存相关函数(1)创建(获得)共享内存(2)共享内存和进程的连接(at)(3)共享内存的控制(ctl)(4)共享内存的分离(dt)(三)练习巩固(1)(未进程同步)简单的使用共享内存(2)使用信号量同步后的进程a , b(一)共享内存(1)共享内存实现进程间通信的原理:共享内存在物理内存上开辟的空间多个进程可以将自己的虚拟空间地址映射到该块物理空间上多个进程都可以访问共享内存中的数据共享内存上的改动可以原创 2021-11-25 20:50:16 · 1025 阅读 · 0 评论 -
【Linux】IPCS/IPCRM命令详解
查看消息队列、共享内存、信号量的使用情况命令: ipcs 或者 ipcrm结果:让我们试试输出ABC那三个进程使用信号量数组的情况可以明显看到占用了semid = 3 的 (key_t) 0x22b8 (十进制就是8888),nems = 3 三个信号量...原创 2021-11-25 14:24:30 · 1798 阅读 · 0 评论 -
【Linux】进程通信(信号量 练习巩固)
题目:三个进程 a、b、c 分别输入“A”、“B”、“C”,要求输出结果必须是“ABCABCABC”分析:按照ABC的顺序打印的话,可以看到总共3个A、3个B、3个C,所以未同步之前的进程大致是这样:#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(){ for(int i = 0; i < 3; i++) { write(1, "A", 1); /*原创 2021-11-25 12:02:12 · 642 阅读 · 2 评论 -
【Linux】进程间通信(信号量 Semaphore)
文章目录(一)信号量(二)信号量的作用(三)信号量的使用(一)信号量信号量是一个特殊的变量,一般取正数值。代表着允许访问资源的数目。获取资源时,需要对信号量原子减一,称为p操作(荷兰语passeren)。释放资源时,需要对信号量原子加一,称为v操作(荷兰语Verhoog)两个概念:临界资源:同一时刻,只允许一个进程或者线程访问的资源临界区:访问临界资源的代码段(二)信号量的作用作用:主要用于同步进程。二值信号量:信号量的值如果只取0,1;计数信号量:信号量的值大于1;原创 2021-11-24 22:25:27 · 1131 阅读 · 0 评论 -
【Linux】进程间通信(管道)
文章目录(一)管道(二)管道的分类(1)有名管道(2)无名管道(3)管道的特点(4)管道的实现(一)管道管道可以在两个进程间传递数据,比如ls -l | grep main.c,其中的"|"就是管道。上述命令的意思就是查看当前所在目录的结果写入管道,然后grep再从管道中过滤得到main.c的文件显示在屏幕上;(二)管道的分类(1)有名管道创建方式命令创建 mkfifo FIFO系统调用创建int mkfifo(const char* filename, mode_t mode);头原创 2021-11-24 12:05:30 · 389 阅读 · 0 评论 -
【Linux】孤儿进程、僵死进程和信号
一、孤儿进程父进程结束,子进程还未结束,然后子进程就交给init进程照顾二、僵死进程(僵尸进程)父进程未结束时,子进程已经结束,并且父进程未处理子进程的退出状态。一个进程是由进程实体和进程控制块组成,进程结束时,实现释放进程的内容,再释放进程控制块。**僵尸进程的形成过程:**进程已经结束,进程实体已经被释放,但是系统并没有释放对应的进程控制块(PCB);#include <stdio.h>#include <stdlib.h>#include <unist原创 2021-11-23 02:00:00 · 463 阅读 · 0 评论 -
【Linux】信号表
声明: 转载,侵删(一)信号定义的规则:在 Linux 下,每个信号的名字都以字符 SIG 开头,每个信号和一个数字编码相对应,在头文件 signum.h 中,这些信号都被定义为正整数。信号名定义路径:/usr/include/i386-linux-gnu/bits/signum.h(二)查看信号表命令kill -l要想查看这些信号和编码的对应关系,可使用命令:kill -l(三)编号解释列表中,编号为 1 ~ 31 的信号为传统 UNIX 支持的信号,是不可靠信号(非实时的),编号为 32转载 2021-11-22 21:01:34 · 541 阅读 · 0 评论 -
【Linux】进程复制fork()
文章目录(一)使用fork()创建子进程(1)系统调用fork()特点:(2)简单使用fork()(3)分析程序的结果1(4)分析程序结果2(二)总结(一)使用fork()创建子进程(1)系统调用fork()特点:fork()调用一次,生成一个新的子进程父进程、子进程各自返回一次父进程中返回子进程的PID(进程号),子进程返回0(2)简单使用fork()#include <stdio.h>#include <unistd.h>int main(){ pid_原创 2021-11-21 19:56:48 · 1256 阅读 · 0 评论 -
【Linux】Linux-2.6.11.12内核系统调用表
entry.S文件下的sys_call_table系统调用表.dataENTRY(sys_call_table) .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ .long sys_exit .long sys_fork .long sys_read .long sys_write .long sys_open /* 5 */ .long sys_close .long原创 2021-11-21 16:29:43 · 1166 阅读 · 0 评论 -
【Linux】文件操作函数-cat命令-cp命令简单仿写
文章目录(一)库函数、系统调用(1)C语言文件操作库函数(2)Linux系统调用(二)用户态和内核态相关知识(三)系统调用的使用测试(一)库函数、系统调用库函数:在函数库实现中、在用户空间调用执行(1)C语言文件操作库函数FILE* fopen(const char* pathname, const char* mode); // mode "r"int fread(void* buff, size_t size, size_t count, FILE* fp);fwrite(void* bu原创 2021-11-21 15:36:54 · 3214 阅读 · 0 评论 -
【Linux】文件压缩解压
文件的压缩与解压文件尾含有.tar.gz或者.tgz都是Linux下的压缩文件.tgz文件压缩tar zcf filename.tgz //需要压缩的文件列表.tar.gz文件压缩(1)tar cf filename.tar 文件列表(2)gzip filename.tar解压tar zxf filename.tgz/filename.tar.gz...原创 2021-11-13 20:15:32 · 604 阅读 · 0 评论 -
【Linux】cmake
linux下使用cmake管理C++项目一、cmake简介:普通的文件管理方式:cmake的管理方式:cmake优点:cmake可以跨平台对项目进行管理,如需增加/减少源文件,对于不同的平台,只需要修改CMakeLists.txt文件内容即可。二、cmake的基本语法基本语法格式:指令(参数一 参数二)-参数使用括弧括起来;-参数之间使用空格或者分号隔开;指令大小写无关,参数和变量是大小写有关的set(HELLO main.cpp)add_executable(hello原创 2021-10-21 10:52:00 · 617 阅读 · 0 评论 -
【Linux】实现cp命令
1、代码如下#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <stdlib.h>#include <assert.h>#include <string.h>int main(int argc , char *argv[]){ if(argc != 3) { printf("参数错误\n"); exit(0); } //源文原创 2021-04-05 21:02:38 · 971 阅读 · 0 评论 -
【linux】实现从键盘获取字符串到文件输出
1、代码实现:#include <stdio.h>#include <unistd.h>#include <assert.h>#include <string.h>#include <stdlib.h>#include <fcntl.h>int main(int argc, char *argv[]){ if(argc<2) { printf("argument is not enough"); e原创 2021-04-05 15:33:42 · 985 阅读 · 0 评论 -
【Linux】用户管理
Linux是多用户的操作系统Linux存储用户信息的文件———————————————————————————————————————存储用户的基本信息:/etc/passwd用户名:密码的占位符:用户ID:用户详细信息:家目录:默认使用的终端程序———————————————————————————————————————存储用户密码: /etc/shadow用户名:$加密算法的ID$加密密钥$密文———————————————————————————————————————用户分组原创 2021-04-04 13:03:17 · 242 阅读 · 0 评论