自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 收藏
  • 关注

原创 系统编程目录

Linux 下的c语言系统编程(1)信号处理的两种方式

2021-06-04 21:14:42 95

原创 系统编程-----线程

线程pthread_self():获取当前线程号pthread_t pthread_self(void); 获取当前线程线程号-lpthread.线程库没有在标准库中,所以加编译时动态加载库main()函数创建的线程叫主线程:如果主线程结束,则其它线程会自动结束(无法运行)pthread_create():创建子线程int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (v

2021-06-07 22:34:48 167

原创 系统编程-----进程间通信方式

5种进程间通信方式:信号,管道,消息队列,共享内存,原始套接字1种解决进程间通信并发时竞争问题的解决办法:信号量类型 连接? 可靠? 流控制? 记录? 消息类型或优先权?消息队列 是 是 是 是 是TCP套接口 是 是 是 否 否UDP数据报套接口 否 否 否 是 否FIFO

2021-06-06 21:23:05 138

原创 系统编程---共享内存

共享内存#if 0共享内存:1.系统调用:mmap(),munmap();2.system v:共享内存3.系统调用:将内存中的直接映射到文件(写入文件),将文件中的映射到内存(读取文件);1)打开文件open();2)内存映射:mmap();将文件描述符映射为内存地址void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);@addr:映射到的地址,NULL表示由系统自动分配@leng

2021-06-06 13:32:36 219

原创 semctl函数

semctl函数int semctl(int semid, int semnum, int cmd, …);@semid:信号量数组标识@semnum:要操作的信号量数组的信号量下标@cmd:IPC_STAT 查询此信号量数组的数据存入arg.buf(buf为struct semid_ds结构体指针)IPC_RMID 删除指定semid的信号量数组GETVAL 获取信号量的当前值,SETVAL 设置信号量的值,初始化要用的命令#include <stdio.h>

2021-06-05 22:20:00 2324

原创 系统编程----信号量

信号量#include <stdio.h>#if 0system v模式通信(ipc):信号量(解决并发时竞争问题),共享内存,消息对列附 ipc相关命令一 ipc相关的命令1.查询ipc相关内容: ipcs只显示某项内容: -q 消息队列, -s 信号量 , -m 共享内存2.删除某system v ipc: ipcrm删除某一项:-q 消息队列标识msqid, -Q 按msgkey删除-s 信号量标识semid, -S 按semkey删除-m 共享内存标识sh

2021-06-05 17:47:09 253

原创 系统编程----消息队列

消息队列1.获取key:ftok();2.获取或创建消息队列:int msgget(key_t key, int msgflg);@msgflg的值:IPC_CREAT,IPC_EXEC,mode;返回值:成功返回消息队列标识:msgid3.发送消息:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);@msgp:要发送的消息:struct msgbuf {long mtype; /*消息类型:

2021-06-05 16:59:22 222

原创 系统编程----管道_命名管道

命名管道1.命名管道创建:int mkfifo(const char *pathname, mode_t mode);@pathname:命名管道路径@mode:权限2.打开open();3.读写:write(),read();4.关闭:close();#include <sys/types.h>#include <sys/stat.h>#include <stdio.h>#include <fcntl.h>#include <s

2021-06-05 12:18:20 154

原创 系统编程——管道_高级管道

高级管道高级管道:将命令运行结果读入到程序,或将程序运行结果输出到命令ls -l | grep ^d“r” “w”将左边命令的输出作右边命令的输入步骤1.调用popen()打开高级管道FILE *popen(const char *command, const char *type);@command:shell命令@type:读写类型,“r”:读 “w”:写返回文件指针读fread()或写fwrite();size_t fread(void *ptr, size_t siz

2021-06-05 11:44:59 259

原创 系统编程——管道_管道的读取和写入方式

管道的读取和写入方式管道文件与普通文件读写区别:1.管道文件只能顺序读,不能随机读写lseek;2.读完会清除已读取的数据3.写数据是追加写例子#include <stdio.h>#include <unistd.h>#include <string.h>int main(){ int pfds[2] = {0}; if(pipe(pfds) < 0) { perror("pipe error"); return -1; }

2021-06-05 11:28:33 1057

原创 系统编程----管道_无名管道

管道进程间通信2:管道管道命令:|,root@student-machine:~# ls -l | grep ^d | wc -l 统计当前目录下的子目录个数10管道有方向:管道左边命令的输出作管道右边命令的输入管道的特征:1.管道是半双工2.无名管道只能用于有亲缘关系的进程,命名管道用于非亲缘关系的进程3.数据的读出和写入必须同步, 关闭读端去写会导致进程异常结束, 关闭写端去读会使用read()非阻塞读不到数据4.管道不能使用lseek();无名管道:1.创建无名管道int

2021-06-05 11:12:07 163

原创 系统编程 ---查询搁置(屏蔽)信号集

查询搁置(屏蔽)信号集sigpending函数int sigpending(sigset_t *set);@set:用于存储查询到的未处理的信号成功返回 0#include <stdio.h>#include <signal.h>#include <unistd.h>#include <stdlib.h>void sigfun(int args){ printf("%s %d start\n", __func__, __LINE_

2021-06-05 10:45:22 83

原创 系统编程———信号屏蔽

信号屏蔽信号屏蔽(信号搁置)与忽略信号的区别1.信号屏蔽并没有删除信号,只是将未处理的信号存入了搁置信号集,而忽略信号是将未处理的信号直接删除信号屏蔽函数:int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);@how:1.级联方式:在原有基础上加减: 5 + 1 = 6, 6 - 1 = 5SIG_BLOCK +信号,屏蔽The set of blocked signals is the union of

2021-06-04 23:05:55 713

原创 系统编程------信号集

信号集能表示多个信号——信号集(signal set)的数据类型信号集操作相关函数:int sigemptyset(sigset_t *set); //清空信号集int sigfillset(sigset_t *set); //填充信号集int sigaddset(sigset_t *set, int signum); //添加指定信号到信号集int sigdelset(sigset_t *set, int signum); //从信号集删除指定信号返回成功 失败: < 0int s

2021-06-04 22:29:57 90

原创 系统编程——注册信号处理方式

注册信号处理的两种方式两个函数所在头文件都为 #include<signal.h>1.signal()函数typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);@signum:信号值 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE

2021-06-04 21:12:45 251

原创 系统编程内容

系统编程:操作系统四大基本服务cpu调度,存储管理(段内存),IO控制,文件系统用户层程序如何使用系统服务(通过软中断调用系统服务):库函数,系统调用文件IO(使用系统调用实现文件IO);IO控制(一切兼文件:1.数据文件 2.设备文件3.进程文件/proc)进程(资源分配的基本单位),线程(cpu调度的基本单位); 进程间通信方式网络编程(IO控制) udp,tcp数据库编程:sqlite32.除函数调用外(连环招:步骤和函数),理论重要linux中文件模型文件静态模型 :stru

2021-05-28 13:59:56 296

原创 指针类型强制转换问题

指针类型强制转换:如下代码所示:short *num_short_ptr = (short *)&num;num 为int 型 但是要使用为short类型的指针去指向它,则就需要对&num进行强制转换,将num的数据类型转换为short型;#include <stdio.h>void Prit_bit(short num);void Pritint_bit(int num);int main(){ int num = 65536; short nu

2021-05-27 20:13:03 368

原创 数据结构_链表

数据结构_链表链表的定义链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。链表的分类单向链表创建一个节点struct node{ void *data;//数据域 struct node *next;//指针域:指向下一个节点地址};typedef str

2021-05-25 14:54:31 106

原创 条件编译 文件操作

条件编译#include <stdio.h> //#include 头文件包含.h以及.c#include "2_2temp.c" //.c和.h只是一个名称后缀而已,既然C程序员约定熟成了,根据约定来int main(){ Print(); return 0;}#include <stdio.h>//内容1:#if #else #endif//内容2:#ifndef #else #endif//内容3:#ifdef #else

2021-05-24 21:36:59 246

原创 内存管理 万能指针 宏替换与typedef 结构体 共用体

内存管理

2021-05-24 15:18:53 182

原创 二级指针--个人误区解决

二级指针#include <stdio.h>//二级指针:还是指针,所以满足指针原本的特性,但是他用于存储一级指针的地址,//经常用于:在做函数参数是改变一级指针的指向int main(){ int num_a = 10; int num_b = 20; int *p_a = &num_a; int **p = &p_a; printf("&num_a = %p\n",&num_a); printf("*p

2021-05-24 11:07:37 50

原创 递归函数 字符串处理函数库 数学库

递归函数本质:自己调用自己#include<stdio.h>int add(int num);int main(){ printf("Sum = %d\n",add(3)); return 0;}//小例子:求1-100的和,使用递归函数做/***************************** * 函数名:int add(int num) * 函数功能:求1-100的和,使用递归函数做 * 参数: * num:要累计到的最大的值 *

2021-05-24 11:01:04 188

原创 有参函数 堆区、栈区和全局静态区、静态变量 静态全局变量

有参函数#include <stdio.h>/************************2.有参函数 1.1 普通变量参数函数 1.2 数组变量参数函数 1.3 指针变量参数函数************************/void Swap(int a, int b);void Swap_ptr(int *a, int *b);#if 0int main(){ int a = 10; int b = 20; printf("

2021-05-23 14:24:38 108

原创 数组 数组定义时初始化 二维数组的初始化

数组#include <stdio.h>int main(){ //数组:相同大小,相同类型的数组的集合,且占用一片连续的空间 //普通变量定义:类型 变量名; //数组变量定义:类型 数组名[个数]; //使用中括号去区分变量与数组 //访问方式:使用下标法,下标是从0开始的,例如num[0] 访问第一个 int num[10]; //定义可以存储10个元素的数组 //开辟10个空间给num //定义后赋值 num[0] = 100; printf("num[0] =

2021-05-22 21:32:24 450

原创 goto语句

goto语句#include <stdio.h>int main(){ //goto是标签语句:goto 是跳转到标签。 //前提是标签,问题来了“标签如何定义” //定义标签: 标签名任意(不能是关键字): //例如 logo: int sum = 0;xxxx: //定义标签 for(int i = 0; i < 1000; i++) { sum += i; goto xxxx1; //无条件跳转到xxxx标签语句去执行 } // CTRL +

2021-05-22 19:45:41 102

原创 异或 逗号表达式 类型转换

异或#include <stdio.h>int main(){ //异或:相同则假,不同为真 //同0同1都为假,否则为真 int num_1 = 0x01; //0000 0001 int num_2 = 0x03; //0000 0011 //异或 num_1 ^ num_2; //0000 0010 printf("异或结果: %x \n",num_1 ^ num_2); //不需要中间变量直接进行交换数据 num_1 = num_1 ^ num_2; //0000

2021-05-22 14:40:16 114

原创 赋值运算符 比较运算符 位运算符

赋值运算符#include <stdio.h>//赋值运算符本质//+= //-=//*=///-//%=//本质:先算表达式右边的在将左边的值以及符号移动到右边进行计算//例如: int a = 10;// a += 100 + 200 + 300 ----> a = a + (100 + 200 + 300)// a *= 100 + 200 + 300 ----> a = a * (100 + 200 + 300)int main(){ in

2021-05-22 12:23:56 99

原创 字符串 字符串的输入 字符串的strlen追加 putchar getchar scanf

字符串1.字符串以 \0结尾 变量名指向字符串地址首单元 字符串占用一片连续的地址空间#include<stdio.h>int main(){char num_str[1024] = "";printf("请输入一个数据\n");scanf("%s",num_str);//字符数组不需要取地址,原因字符串名(数组名)就是首地址printf("您输入的数据为:%s",num_str);}请输入一个数据name2您输入的数据为:name2putchar函数/***

2021-05-22 10:55:44 155

原创 知识点 -补码

在计算机中使用二进制表示,但是在c语言中只能使用8、10、16进制表示在Ubuntu中查ascii码 man ascii浮点类型 是 近似数 只能使用范围去判断它,不能直接去判断。

2021-05-21 23:21:05 232 5

原创 2021-05-21

变量变量 :在程序执行期间,其值可以变的量1.1 变量的声明 extern + 类型 + 变量名1.2 变量的定义 类型 + 变量名1.3 变量的基本类型(内置类型)char, short,int,float,double标识符2.1标识符:由字符,数字,下划线以外的字符命名。2.2 程序员三种命名规范.1. 大驼峰:特征:单词前面首字母大写 如:MyName.2. 小驼峰:特征:第一个单词首字母小写,后面单词首字母大写如:myName.3. 下划线:特征:单词之间用下划线隔开

2021-05-21 22:19:52 56

原创 嵌入式11

make :自动编译管理器。makfile提高效率。名字必须为makefile,或者Makefile。makefile基本结构:目标 : 依赖tab 命令hello.o : hello.cgcc -c hello.c -o hello.o运行 make意义:make:解决多文件联合编译的问题。1)gcc也可以少数多文件联合编译,如果有10个,100个c文件,就用make工具。2)自己编写一遍,makefile 编译文件,别人就不用再写一遍了。安装: sudo apt..

2021-04-27 08:57:31 59

原创 嵌入式学习10

使用gdb前:gcc -g 必须加。L : list 查看代码10行Q:quit 退出。l 7 l printt :查看函数查看行数ctrl + l : 清除屏幕break :b: 断点info b : 查看断点。delete 2:删除断点run 运行 以 停在断点的地方。单步调试:不进入函数 单步调试 next / n进入函数单步调试 step /s 有时候是一样的。ctrl + l : 清空continue / c 结束单步调试,继续向下运行,一个是单步调试,一个是.

2021-04-23 15:00:22 60

原创 嵌入式学习09

gccgcc -vgcc --version预编译 : # inlcude<stdio.h>#if 1(0)#define max 1 -> .i汇编 : .c -> .s编译 : .c/ .i /.s ->.o链接 : .o -> 可执行文件。预处理 gcc -E hello.c 输出到屏幕上 gcc -E hello.c > a.txt 输出到文件中 gcc -E hello.c -o hello.i.

2021-04-22 15:18:18 62

原创 嵌入式学习08(vim)

1.vim 软件2.Vi : 编辑器 编辑文本的软件。vim 什么都不加 进入软件。命令模式->编辑模式i I,a A O o编辑模式->命令模式Esc命令模式退出: w 保存 q退出 !强制退出。命令模式 -> 底行模式 :由 底行模式 -> 命令模式Backspace。再次打开文件 或者编辑文件Vim 文件名W 另存为的功能。在命令行模式下:j : 向下k : 向上h :向左l : 向右 :想让所有的操作都在主键盘中进

2021-04-21 15:04:02 65

原创 嵌入式学习08(网络命令)

Linux :ifconfig : 查看ip地址 广播地址 子网掩码等信息。Windows 中查看 ip 方法Windows标志-> cmd 回车-> ipconfig设置ip方法Ifconfig eth0 192.168.1.17ifconfig eth0 downifconfig eth0 upping :查看链接是否成功。ping windows ip地址ping www.Baidu.com互相pingping www.souhu.comping w.

2021-04-20 15:09:32 168

原创 如何挂载u盘到linux系统中?

在windows中的u盘中创建一个a.txt的文件。在linux中用fdisk -l 查看并没有 u盘插入u盘以后,用fdisk -l 查看u盘 显示/dev/sdb1 这个设备文件cd /mnt 中创建一个文件 名字叫做 usb用 mount -t vfat /dev/sdb1 usb进入 usb 中 cp mv 某个文件卸载 :Umount usb或者 umount /dev/sdb1然后删除 入门-rf usb...

2021-04-19 22:14:33 294

原创 指针 函数指针、回调函数、指针函数、 指向数组的指针

指针int var_runoob = 10;int *p;p = &var_runoob;函数指针函数指针是指向函数的指针变量(函数指针是专门用来存放函数地址的指针)。函数地址是一个函数的入口地址,函数名代表了函数的入口地址;当一个函数指针指向了一个函数,就可以通过这个指针来调用该函数,可以将函数作为参数传递给函数指针。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。函数指针变量的声明:*ty

2021-04-17 20:29:04 105

原创 嵌入式07

adduser : 增加一个有主目录的用户Useradd : 增加一个无用户主目录的用户Su 来验证 cd 来验证。Userdel + 用户名:user deleteRm -rf 删除 用户主目录Deluser +删除用户: delete user删除用户的同时 不删除主目录当自己是当前的用户的时候,不能把自己删掉。Userdel -r 可以删除用户的同时删除主目录。屏蔽用户 禁用 用户 用 #编辑 /etc/passwd 这个文件id 查看用户 id 组i.

2021-04-16 22:09:20 42

原创 嵌入式学习笔记06

ps : 查看当前运行的进程Ps -e : 显示跟多信息Ps -ef : 显示更多信息。Ps -aux : 显示更多关于进程的信息Top 动态监控 进程运行情况。-A : 列出所有进程Pstree : 查看进程树。Nice : 查看当前进程的进程优先级Renice 设定进程的优先级测试 renice 和nice的方法写一个无限循环的程序在内部调用 system(“nice”)另一个终端 ps -aux | grep a.outRenice -n 5 进程号ki.

2021-04-16 08:49:47 53

原创 嵌入式学习笔记05

grep : 在文件中搜索内容grep 找谁字符串 + 在哪个文件中通配符 : * : 任意多个字符? : 一个字符【a-z】 : 范围【abc】 : 可选项在目录中的文件中找文本内容grep -R what /bingrep -R hello /bingrep -R root /etcgrep -R ls /etc-R r 大小写都可以-n 显示行号 number grep -n dandy /etc/passwdgrep -n root /..

2021-04-14 10:41:08 48

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除