
c语言
文章平均质量分 66
qq_33808440
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
c语言系统编程十四:Linux进程间的同步与互斥
【代码】c语言系统编程十四:Linux进程间的同步与互斥。原创 2022-09-19 11:32:47 · 796 阅读 · 0 评论 -
c语言系统编程十三:Linux线程间的同步与互斥
多任务操作系统中会遇到两个问题:1 . 多个任务需要访问 / 使用同一资源。2 . 多个任务之间有依赖关系,某个任务任务的运行依赖于另一个任务。同步和互斥就是用于解决这两个问题的。互斥:同一时间,只能一个任务(进程或线程)执行,谁先运行不确定。同步:同一时间,只能一个任务(进程或线程)执行,有顺序的执行。同步是特殊的互斥。用于线程的互斥。互斥锁是一种简单的加锁的方式来控制对共享资源的访问,互斥锁只有两种状态:加锁(lock)和解锁(unlock)原创 2022-09-19 10:05:15 · 1673 阅读 · 0 评论 -
c语言系统编程十二:Linux多任务编程之线程
线程是轻量级的进程(LWP);在Linux环境下线程的本质仍然是进程;为了让进程完成一定的工作,进程必须至少包含一个线程;进程是系统分配资源的基本单位;线程是cpu执行调度的基本单位;线程依赖于进程,线程共享进程的资源,线程独立的资源有(计数器,一组寄存器,栈);进程结束,当前进程的所有线程都将立刻结束。原创 2022-09-06 01:49:27 · 882 阅读 · 0 评论 -
c语言执行外部程序的几种方法
代码】c语言执行外部程序的几种方法。原创 2022-08-03 16:47:14 · 2991 阅读 · 0 评论 -
c语言系统编程十一:七种Linux进程间通信方式总结
七种Linux进程间通信方式比较原创 2022-07-07 14:29:49 · 446 阅读 · 0 评论 -
c语言系统编程五:linux进程间通信之信号
linux进程间通信之信号一 信号的概述1.1 信号的概念1.2 信号的特点1.3 信号周期的三部分1.4 信号的编号1.5 信号的四要素二 信号的产生与动作三 发送信号API3.1 kill函数一 信号的概述1.1 信号的概念信号是Linux进程间通信的最古老的方式。信号是软件中断,它是在软件层面上对中断机制的一种模拟,是一种异步通信方式。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。1.2 信号的特点简单,不能携带大量信息,满足某个特设条件才发送。1.原创 2022-07-07 14:06:20 · 921 阅读 · 0 评论 -
c语言系统编程十:Linux进程间通信之共享内存
共享内存允许两个或多个进程共享给定的存储区域。共享内存的特点:二 共享内存相关API2.1 获得一个共享存储标识符shmget需要的头文件和函数原型功能创建或打开一块共享内存区参数返回值2.2 使用shell命令操作共享内存查看共享内存ipcs -m删除共享内存ipcrm -m shmid2.3 建立进程的虚拟内存和物理内存的映射函数shmat需要的头文件和函数原型功能将一个共享内存段映射到调用进程的数据段中参数返回值注意shmat函原创 2022-06-21 15:56:15 · 2091 阅读 · 0 评论 -
c语言系统编程九:Linux进程间通信之mmap
mmap:存储映射I/O(Memory-mapped I/O);mmap:将一个磁盘文件和进程的一块虚拟内存做映射;于是当从内存读数据时就相当于从文件中读取相应的字节;当将数据存放到内存时就相当于将相应的数据写入文件。这样可以不使用read和write函数,只使用地址(指针)就能完成I/O操作。...原创 2022-06-21 14:25:58 · 457 阅读 · 0 评论 -
c语言系统编程八:Linux进程间通信之消息队列
消息队列是消息的链表,存放在内存中,由内核维护;System V提供的IPC通信机制需要一个key值,通过key值就可以在系统内获得一个唯一的消息队列标识符。key值可以人工指定,也可以通过ftok函数获得功能参数返回值功能参数返回值删除消息队列3.4 消息队列的信息格式的定义消息队列的信息格式是需要人工定义的,格式放在一个结构体中;信息结构体中的第一个long型的成员的作用是,只有对这类信息感兴趣的进程才能拿到这类信息功能向消息队原创 2022-06-21 11:11:33 · 2966 阅读 · 0 评论 -
c语言系统编程七:Linux进程间通信之有名管道
有名管道需要的头文件和函数原型参数返回值四 有名管道案例六 命名管道实例-单机qq聊天实现单机QQ聊天。提示:父进程创建子进程,实现多任务。父进程负责发消息(向FIFO里写数据),子进程负责接收信息(从FIFO里读数据)。打开命名管道用阻塞方式打开。...原创 2022-06-16 10:50:50 · 791 阅读 · 0 评论 -
c语言系统编程六:Linux进程间通信之无名管道
Linux进程间通信之无名管道函数功能从系统中寻找最小的可用文件描述符,作为已有文件描述符oldfd的副本,新文件描述符和旧文件描述符指向同一文件,新文件描述符提供dup的返回值返回。dup函数案例功能将newfd作为oldfd的副本。如果newfd事先存在,dup2会先close掉newfd,然后将newfd作为oldfd的副本。dup2函数实例管道(pipe)又称无名管道。无名管道是一种特殊类型的文件,在应用层体现为两个...原创 2022-06-13 16:52:23 · 857 阅读 · 0 评论 -
c语言一:c语言的编译过程
c语言的编译过程一. 预处理二. 编译三. 汇编四. 链接一. 预处理预处理的作用:1. 处理头文件包含2. 处理宏替换3. 处理条件编译4. 删除注释5. 不做语法检查操作:gcc -E hello.c -o hello.i二. 编译编译的作用:1. 将预处理后的c代码文件 编译成 汇编语言文件2. 做语法检查操作:gcc -S hello.i -o hello.s三. 汇编汇编的作用:将汇编语言文件编译成二进制文件操作:gcc -c hello.s -o h原创 2022-02-23 16:00:19 · 460 阅读 · 0 评论 -
c语言三:scanf和getchar
一 scnaf和getchar是先将键盘输入的字符串放入标准输入设备(内存中的一段特殊缓冲区),然后再从里面取字符键盘输入abc回车后,先将字符串abc\n放入标准输入设备(内存中的一段特殊缓冲区)getchar()取一个字符scanf和getchar()都是阻塞程序执行,等待标准输入设备有数据时才开始拿数据,都是拿一个字符,然后程序可以继续执行,再遇到scanf或getchar()会拿标准输入设备中剩余的字符int main(int argc, char *argv[]){原创 2022-02-23 17:53:21 · 490 阅读 · 0 评论 -
c语言五:位运算符
一 按位与: &规则: 全1为1;其他为0例子 1010 1010& 1111 0000--------------- 1010 0000特点: 和1相与保持不变;和0相与清零应用场景: 将固定位清零二 按位或: |规则:有1就为1;全0为0例子 1010 1010| 1111 0000----------- 1111 1010特点: 和0相或保持不变;和1相或置1应用场景:将固定位置1案例: 将1010 1010的第2,3位置1原创 2022-02-24 11:30:15 · 330 阅读 · 0 评论 -
c语言二:c语言的数据类型
一 不同的数据类型被分配不同的内存大小,是为了节约内存,合理使用内存二 char, short, int, long, float, double数据类型的内存空间依次增大三 数据类型种类四 变量系统根据变量的类型,在内存中开辟相应的空间,其值可以被修改变量名代表的是变量存储的内容,操作变量就是对空间的内容的操作五 整型常量按进制分十进制:int a=10;十六进制,以0x或0X开头:int b=0xae;八进制,以数字0开头:int a=0256;printf函数以八进原创 2022-02-24 11:31:08 · 303 阅读 · 0 评论 -
c语言四:printf函数
printf函数一 printf中的格式化%s二 格式化输出时的各种占位符一 printf中的格式化%s系统会在字符串常量末尾自动添加一个字符’\0’printf("%s", “hello”) ; //%s 从字符串的首元素开始逐个输出,直到遇到’\0’int main(int argc, char *argv[]){ printf("第一个%s\n", "hello world"); printf("第二个%s\n", "hello\0world原创 2022-02-24 11:31:46 · 194 阅读 · 0 评论 -
c语言六:选择语句
选择语句一 switch选择语句一 switch选择语句switch (ch){ case 值1: //只能是int型或字符型;不能是实型或字符串 语句1; break; case 'w': //命中w后不会再判断W,直接执行语句2 case 'W': 语句2; break; default: //可以省略 语句n: break; }...原创 2022-02-24 13:54:19 · 193 阅读 · 0 评论 -
c语言七:数组
数组一 数组的概念二 数组的定义2.1 数组定义的步骤三 一维数值数组3.1 一维数值数组的定义3.2 一维数值数组的定义并初始化3.3 数组名作为数组类型时,代表的是数组的空间总大小(字节)四 二维数值数组4.1 数组的数组4.2 二维数组的初始化4.3 二维数组中各个地址的关系4.4 二维元素中数组名代表类型时表示数组在内存中的空间大小五 一维字符数组5.1 一维字符数组的初始化5.2 数组的第0个元素的地址可以用 数组名 表示也可以用 &数组名[0] 表示5.3 一维字符数组逐个字符初始化和以原创 2022-02-24 17:37:49 · 941 阅读 · 0 评论 -
c语言九:内存布局和普通局部变量、普通全局变量、普通函数、静态局部变量、静态全局变量、静态函数
内存布局和普通局部变量、普通全局变量、普通函数、静态局部变量、静态全局变量、静态函数一 内存布局二 普通局部变量2.1 定义形式2.2 作用范围2.3 生命周期2.4 内存中的存储区域2.5 注意事项三 普通全局变量3.1 定义形式3.2 作用范围3.3 生命周期3.4 内存中的存储区域3.5 注意事项四 静态局部变量4.1 定义形式4.2 作用范围4.3 生命周期4.4 内存中的存储区域4.5 注意事项五 静态全局变量5.1 定义形式5.2 作用范围5.3 生命周期5.4 内存中的存储区域5.5 注意事项原创 2022-02-25 14:43:29 · 988 阅读 · 0 评论 -
c语言八:函数
函数一 函数的定义二 函数的声明三 函数的调用四 定义一个无返回值的函数时,函数体也要有return语句五 如果函数没有形参,尽量在定义函数时,把形参的位置放个void六 带函数的代码的编译步骤七 函数的形参本质是函数的局部变量八 形参在函数定义时不会开辟内存空间,只在函数调用时才开辟内存空间,形参在函数结束时释放九 函数名代表函数的入口地址十 函数的返回值<=4字节时存放在寄存器中;>4字节时存放在栈区一 函数的定义实现函数功能,确定函数体,返回值类型,形参类型,让函数存在返回值类型 函原创 2022-02-25 14:45:54 · 679 阅读 · 0 评论 -
c语言十:头文件包含
原创 2022-02-25 14:51:10 · 564 阅读 · 0 评论 -
c语言十一:宏定义
宏定义一 无参数的宏定义一 无参数的宏定义#define 宏名 字符串终止宏的作用域:#undef 宏名原创 2022-02-25 15:27:21 · 430 阅读 · 0 评论 -
c语言十二:三种条件编译
三种条件编译一 条件存在二 条件不存在三 条件判断是否成立一般情况下源程序中所有行都参加编译,但有时需要对部分源程序行只在满足一定条件时才编译,即对部分源程序行指定编译条件一 条件存在定义了某个宏,才能编译这些代码[root@ansible9 ~]# cat test.c#include <stdio.h>#define AAint main(int argc, char *argv[]){ # ifdef AA printf("宏AA定义了\n"); # else原创 2022-02-25 15:37:08 · 735 阅读 · 0 评论 -
c语言十三:两种防止头文件重复包含的方法
两种防止头文件重复包含的方法一 头文件重复包含可能会产生错误二 方法一: #pragma once三 方法二: ifndef一 头文件重复包含可能会产生错误编译时报错,num重复定义了:[root@ansible9 ~]# gcc main.cIn file included from main.c:3:b.h:1:5: error: redefinition of ‘num’ int num=10; ^~~In file included from a.h:1,原创 2022-02-25 15:42:01 · 4269 阅读 · 0 评论 -
c语言十四:原码 反码 补码
原码 反码 补码一 计算机用补码的作用1是 把减法运算变成加法运算二 计算机用补码的作用2是统一了-0和+0的编码三 查看内存中原样数据四 数据的存储4.1 有符号负数4.2 有符号正数4.3 十六进制数4.4 八进制数4.5 越界的数据4.6 无符号数赋正值4.7 无符号数赋负值4.8 总结五 数据的读取5.1 %d, %hd, %ld有符号取5.2 %u, %x, %o, %lu无符号取5.3 例子5.4 总结无符号数和有符号正数的原码 反码 补码相同有符号负数的反码是原码除最高位外,其他位都取反原创 2022-02-25 15:54:57 · 1177 阅读 · 0 评论 -
c语言十五:指针基础部分(核心内容)
指针一 有关内存的事1.1 内存的作用1.2 有关内存的两个概念二 指针的相关概念三 指针的定义方法3.1 定义指针变量的步骤:3.2 定义指针变量的一般步骤:四 指针变量的使用(通过指针变量对保存的地址空间进行读写操作)四 指针变量的类型4.1 指针变量的自身类型4.2 指针变量所指向的类型五 指针和变量的关系六 指针和数组元素的关系七 指针数组八 指针的指针九 字符串和指针十 数组指针十一 指针和函数的关系十二 容易混淆的指针十三 特殊指针一 有关内存的事1.1 内存的作用内存是沟通cpu和硬盘原创 2022-03-02 13:48:08 · 1099 阅读 · 1 评论 -
c语言十六:指针进阶篇
一 指针和数组元素的关系1.1 数组元素的指针定义一个指针变量保存数组第0个元素的地址(数组首元素地址)用指针变量数组#include <stdio.h>int main(int arg, char *argv[]){ int arr[5]={10,20,30,40,0}; int *p=&arr[0]; int i; for(i=0;i<5;i++) { printf("%d\n", *(p+i)); }}用指针变量给数组元素赋值#i原创 2022-03-10 11:43:39 · 364 阅读 · 0 评论 -
c语言十七:动态内存申请
动态内存申请一 动态内存申请二 静态分配内存和动态分配内存2.1 静态分配内存2.2 动态分配内存三 动态内存申请的相关函数3.1 分配内存空间函数 malloc3.2 free函数 (释放内存函数)3.3 案例一:从堆区申请一个int类型的空间3.4 案例二:从堆区申请一个数组,数组的大小由用户决定3.5 calloc函数3.5 realloc函数(重新申请内存空间)四 内存泄漏一 动态内存申请数组的长度是预先定义好的,在整个程序中固定不变;但在实际应用中,往往有这种情况,所需要的内存空间取决原创 2022-03-14 10:29:46 · 6662 阅读 · 1 评论 -
c语言十八:字符串处理
字符串处理一 测试字符串长度函数1.1 strlen二 字符串拷贝函数2.1 strcpy2.2 strncpy三 字符串拼接函数3.1 strcat3.2 strncat四 资产四 const关键字以str开头的函数都是遇到’\0’结束;以str开头的函数都用头文件string.h;一 测试字符串长度函数1.1 strlen函数原型:int strlen(const char *str)功能:计算字符串的长度,不含'\0'参数:存放字符串的内存空间的首地址[root@ansible9原创 2022-03-22 16:37:07 · 1820 阅读 · 0 评论 -
c语言二十:冒泡排序
冒泡排序一 原理和代码二 优化:不用执行完所有轮排序就已经是有序数组了,可以用个flag来判断是否数组已经有序,有序就退出外层循环三 结构体数组按结构体的某个成员排序一 原理和代码#include <stdio.h>#include <stdlib.h>#include <string.h>int main(int arg, char *argv[]){ int arr[10]={3,7,10,4,2,1,5,6,8,9};原创 2022-03-24 10:20:33 · 1111 阅读 · 0 评论 -
c语言二十:typedef
typedef一 typedef的作用二 typedef的使用步骤三 给int数据类型取个别名INT_32四 给数组int [5]类型取个别名ARR_INT5五 给指针类型int *取个别名INT_P六 给函数指针类型取个别名FUN_P七 给结构体类型取个别名STU一 typedef的作用给已有的数据类型取个别名二 typedef的使用步骤先用已有类型定义一个变量;用别名替换变量名;在整个表达式前加typedef三 给int数据类型取个别名INT_32用int类型定义一个变量num;原创 2022-03-24 16:08:14 · 1253 阅读 · 1 评论 -
c语言十九:结构体
结构体一 结构体数据类型的三种定义方式1.1 先定义类型,再定义变量(推荐)1.2 定义类型的同时定义变量1.3 定义一次性结构体1.4 注意事项二 结构体变量的初始化三 结构体变量成员值的清0(用memset)四 结构体变量的成员从键盘获取值五 相同结构体类型的变量之间赋值5.1 一个成员一个成员逐个赋值5.2 用=整体赋值5.3 用memcpy内存数据直接拷贝赋值六 结构体数组6.1 结构体数组的初始化七 定义一个结构体数组,从键盘为每个数组元素的每个成员赋值八 结构体指针8.1 定义一个结构体指针8.原创 2022-03-30 16:38:56 · 2031 阅读 · 0 评论 -
c语言二十:共用体(联合体)
共用体一 共用体概念二 共用体的定义三 共用体的特点一 共用体概念1. 在进行某些算法的时候,有时候需要使几种不同类型的变量存储到同一段内存单元中,几个变量所使用的内存空间相互重叠;2. 这种几个不同变量共同占用同一段内存的结构在C语言中称作共用体3. 共用体所有成员占用同一段内存地址空间二 共用体的定义三 共用体的特点共用体的空间大小由最大的成员大小决定;...原创 2022-04-01 17:42:52 · 761 阅读 · 0 评论 -
c语言二十一:枚举
枚举一 枚举的概念二 枚举类型的定义三 枚举值列表中的元素本质上是宏定义为int类型数据,从0开始,如果某个元素=数值,数值将跳跃一 枚举的概念将变量的值一一列举出来,变量的值只限于列举出来的值二 枚举类型的定义enum 枚举名{枚举值表};在枚举值表中应列出所有可用值,也称枚举元素;枚举变量只能取枚举列表中的元素三 枚举值列表中的元素本质上是宏定义为int类型数据,从0开始,如果某个元素=数值,数值将跳跃[root@ansible9 ~]# cat test.c#includ原创 2022-04-02 12:02:35 · 755 阅读 · 1 评论 -
c语言二十二:链表
链表一 链表的基本概念1.1 链表的概念1.2 静态数组,动态数组(malloc),链表的区别1.3 链表的特点1.4 链表的构成1.5 链表节点的结构体实现代码1.6 静态链表二 单向链表的操作三 其他链表的概念及应用一 链表的基本概念1.1 链表的概念链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构1.2 静态数组,动态数组(malloc),链表的区别静态数组int arr[10]:静态数组必须确定大小,不能实现动态申请,释放;动态数组使用ma原创 2022-04-12 09:53:43 · 226 阅读 · 0 评论 -
c语言二十三:文件操作
文件操作一 文件指针二 文件打开方式的各种组合三 C语言提供的文件读写函数3.1 字节读写函数fgetc fputc3.2 字符串读写函数fgets fputs3.3 数据块读写函数fread fwrite3.4 格式化读写函数fscanf fprintf一 文件指针二 文件打开方式的各种组合三 C语言提供的文件读写函数3.1 字节读写函数fgetc fputc3.2 字符串读写函数fgets fputs3.3 数据块读写函数fread fwrite3.4 格式化读写函数fscanf原创 2022-04-13 14:34:43 · 187 阅读 · 0 评论 -
C语言指针试题2
原创 2022-04-13 14:36:02 · 119 阅读 · 0 评论 -
c语言二十四:文件加密
文件加密一 文件加密器1.1 原理的分析1.2 代码fun.h文件fun.c文件main.c文件一 文件加密器1.1 原理的分析1.2 代码fun.h文件#ifndef __FUN_H__#define __FUN_H__extern void help(void);extern void get_file_name(char *src_file_name, char *dest_file_name);extern char *read_src_file(unsigned long i原创 2022-04-28 11:08:23 · 1447 阅读 · 3 评论 -
c语言二十六:make
make一 make解决两个问题二 make的语法三 makefile变量3.1 自定义变量3.2 系统环境变量3.3 预定义变量(自动变量)一 make解决两个问题大量代码的关系维护减少重复编译的时间make编译时会检查文件是否被修改过,只编译被修改过的源文件二 make的语法目标:依赖文件列表<tab>命令列表三 makefile变量3.1 自定义变量3.2 系统环境变量3.3 预定义变量(自动变量)...原创 2022-05-05 15:31:16 · 1327 阅读 · 0 评论