- 博客(30)
- 收藏
- 关注
原创 不同主机之间的网络通信学习
共享内存 //最高效的进程间通信方式共享内存:1.是一块,内核预留的空间2.最高效的通信方式//避免了用户空间 到 内核空间的数据拷贝IPC通信方式 ---操作流程类似的操作:system v : 共享内存IPC对象操作通用框架:0x ftokkey值 ==> 申请 ==》读写 ==》关闭 ==》卸载。
2024-08-21 19:14:50 2050
原创 线程间的锁
表示进程间使用信号量,value 信号量的初始值,一般无名信号量都是二值信号量(0 1) ,0 表示红灯,进程暂停阻塞,1 表示绿灯,进程可以通过执行。如果sem有资源(==1),则申请该资源,程序继续运行如果sem没有资源(==0),则线程阻塞等待,一旦有资源则自动申请资源并继续运行程序。P ===》申请资源===》申请一个二值信号量int sem_wait(sem_t *sem);V ===》释放资源===》释放一个二值信号量,nt sem_post(sem_t *sem);
2024-08-21 18:54:01 878
原创 进程之间的通信学习
value :信号量的初始值,无名信号量通常为二值(0 或 1 ),0 表示红灯(进程暂停阻塞),1 表示绿灯(进程可以通过执行)。若信号量无资源(值为 0 ),线程会阻塞等待,直到有资源可用。参数:pipefd 用于获取管道的两端,pipefd [0] 为读端,pipefd [1] 为写端。P操作通过 sem_wait 函数实现,其功能是申请使用资源,使资源个数减 1。V操作由 sem_post 函数完成,其作用是释放资源,使资源个数加 1。返回值:成功返回 0 ,失败返回 -1。
2024-08-21 18:49:56 408
原创 线程相关函数操作的学习
pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg) 用于创建新线程。初始化锁:pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)。解锁:pthread_mutex_unlock(pthread_mutex_t *mutex)。缺点:进程间共享数据不方便。
2024-08-15 19:30:44 711
原创 进程与线程
但此时,主线程的结束并不意味着整个进程的结束,只有当进程内的其他线程也都结束后,进程才会终止。孤儿进程:当父进程先于子进程结束时,子进程就成为了孤儿进程。以一个图形处理软件为例,一个进程中可能有多个线程,分别负责图像的读取、处理和显示,即使某个处理线程结束,只要其他线程仍在运行,进程就会继续存在。例如,在一个多任务处理的系统中,父进程可以通过 fork 函数创建多个子进程来分别处理不同的计算任务,提高整体的处理效率。线程的结束并不一定会导致所属进程的结束,只有当进程内的所有线程都结束时,进程才会真正终止。
2024-08-15 19:29:32 338
原创 linux系统的进程学习
设计程序动态生成两个进程分别向相同文件写入不同数据时,需注意父子进程操作同一文件,可通过 open 打开文件,fork 创建进程,在不同的进程分支中通过 sprintf 和 write 写入数据,并使用 getpid 获取进程 ID 及时间来标识。PCB 是一个结构体 task_struct,包含进程标识符(PID)、父进程 ID 号(PPID)、当前工作路径、umask、进程打开的文件列表、信号相关设置、用户 ID 和组 ID、进程资源的上限等信息。进程是动态的,是程序的执行过程。一次调用,返回两次。
2024-08-15 19:28:59 404
原创 linux系统进程学习
进程是正在运行的程序的实例,包含了程序的代码、数据、堆栈等资源。此时,子进程的空间未被回收,可通过 wait 或 waitpid 函数查看子进程的退出状态并进行资源回收。vfork 函数用于提高进程创建的效率,它会阻塞父进程,让子进程先执行,并采用写时拷贝的策略减少不必要的数据拷贝。父子进程空间相互独立,这在保障安全的同时也带来了通信的不便,需要特定的 IPC 机制来实现进程间的有效通信。进程的调度涉及进程上下文的切换,包括进程状态的保存和恢复,数据量较大,对切换效率有一定影响。
2024-08-15 19:26:48 262
原创 文件属性的获取
参数:oldpath:被链接向的文件的路径,newpath:新符号链接文件。参数:oldpath:要链接向的文件,newpath:创建的新硬链接文件。返回值:成功返回获得时间字符串的首地址,失败返回NULL。参数:oldpath:老路径名,newpath:新路径名。功能:创建一个链接向oldpath文件的新符号链接文件。返回值:成功返回id对应用户的信息,失败返回NULL。返回值:成功返回1970年到现在的秒数,失败返回-1。参数:pathname:删除文件的路径。参数:timep:保存秒数空间的地址。
2024-08-12 20:07:09 583
原创 文件目录操作的学习
参数:buf:保存工作路径空间的首地址,size:保存路径空间的长度。返回值:包含文件信息的结构体,出错或者读到目录流末尾返回NULL。参数:path: 文件的路径,buf: 属性存放空间的首地址。返回值:成功返回包含路径空间的字符串首地址,失败返回NULL。参数:pathname:目录文件的名字。返回值:成功返回0,失败返回-1。返回值:成功返回0,失败返回-1。返回值:成功返回0,失败返回-1。返回值:成功返回0,失败返回-1。参数:path:改变到的路径。参数:pathname:路径。
2024-08-12 20:05:03 368
原创 文件IO的学习
feof(FILE*) 用于检测文件是否到达结尾ferror(FILE*) 检测文件是否发生错误clearerr(FILE*) 清除错误。
2024-08-06 21:02:30 1736
原创 标准IO的学习
2.一般我们调用相关IO操作时必须调用stdio头文件库,其位置在/usr/include/stdio.h,linux系统中最高管理者是root。包含:stdin(标准输入),stdout(标准输出),stderr(标准错误输出)。stdin(标准输入),stdout(标准输出),stderr(标准错误输出)5.FILE 结构定义的对象 FILE * 称之为流对象,也叫文件流指针。(3)fread/fwrite自定义大小,可以对二进制数据进行操作。fgetc/fputc,,,,,,一个字符,
2024-08-05 20:38:44 469
原创 shell编程指令的学习
解释型语言,边翻译边执行。cp 1 2与编译型语言(如 C 语言)对比包括bash shellgnuc shellcsh)、k shellksh)、ash等。
2024-08-03 18:25:22 547
原创 结构体与链表的学习
结构体传参一般使用指针传参不使用直接使用结构体本身传参,是因为传参给的指针可以直接定位到你所操作的位置进行操作,而直接使用结构体本身传参会将其复制一份在栈区中操作完后在销毁速度较慢效率不高。4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;
2024-08-01 19:02:22 794
原创 字符串指针以及指针函数的学习
字符串指针本质上还是属于还前面学习的数组指针类似,只不过其中元素类型变成了字符型罢了,今天进行了练习巩固前面学习的指针操作的同时还学习了字符型指针以及指针函数。这一道题就是申请在堆空间申请一个长度为10的一维整型数组,并在其中填入斐波拉契数列的前10项。今天还学习了快速排序其利用了指针可以定位到具体的地方采用递归调用实现快速排序其复杂度较低。在此之外学习了malloc函数其作用是给目标申请堆区空间进行存放的。这几个练习是对字符串类型的数据进行操作的。
2024-07-30 20:44:12 582
原创 指针初学习
(类型名)基类型 *指针变量名 指针变量名不可使用常量代替*p代表的时变量i,而p代表地址一般访问访问分为直接访问和间接访问,直接访问是直接对变量赋值,间接访问是利用指针对变量进行间接赋值。特别注意:若是使用指针操作超出了变量范围则该指针称为野指针使用则会引发系统崩溃。
2024-07-29 18:36:18 392
原创 标识符的作用域与可见性、预处理命令
分为不带参数的宏定义和带参的宏定义。不带参的宏定义 带参数的宏定义#define 标识符 字符串 #define 宏名(参数表) 字符串在预处理阶段将宏名替换为具体数值。要加够括号防止出现错误。带参宏定义效率高于函数。宏定义后不加“;
2024-07-29 17:39:22 475
原创 学习数组作为被调函数的参数
而被调函数的形参形式应为"(char a[][s],int rows)" ~ s为数组的列数。而被调函数的形参形式应为"(int a[][s],int rows)" ~ s为数组的列数。二维整型数组作为被调函数参数时形式应为" (int a,rows) "一维整型数组作为被调函数参数时形式应为" (int a,len) "一维字符型数组作为被调函数参数时形式应为"(char s,len)"二维字符型数组作为被调函数时形式应为"(char s,rows)"
2024-07-26 19:10:52 503
原创 学习函数参数类型和函数特性,嵌套调用和递归调用
传参本质就是实参将自己本身的数值传递给形参的过程,但其本身不参与形参函数里面的运算,因为实参传过去的只是数值而不是其地址故而在运行过程中系统会给形参开辟一个空间存放实参的数据然后代替实参进行操作,而实参不改变。1.形式参数和实际参数:在定义函数时函数名的括号内的变量名称被称之为形式参数,而在主函数调用函数时函数名括号内的变量称之为形式参数。要先将实参存入栈区,而存入顺序形参所对应的实参按自右向左进行存入而在结束调用后再出栈(ps:栈区是有限的)。(3)在被定义的函数中,必须指定形参的类型。
2024-07-25 20:05:40 777
原创 学习二维数组以及函数
这三者虽然都是代表的是第一个元素的地址但代表的含义不同第一个代表二维数组的第一个元素地址,第二个代表为其内部第一个一维数组的第一个元素地址,第三个代表对a[0][0]取址。可以使用两种方式方式1为直接输入数字用“ ,”隔开第2种则为每隔n个(n为列数)用“ {}”进行包裹在每个一维数组之间用“ ,”隔开。2.从函数的角度来分类:即无参函数(即有参函数的特殊情况)和有参函数。类型说明符 数组名 [常量表达式1] [常量表达式2]同时须区别'a', 'a[0]', '&a[0][0]'
2024-07-24 20:32:04 187
原创 字符型数组以及二分查找的学习
~ 用法:strcpy(s1,s2),s2的数据内容拷贝给s1,使用时为了防止发生越界访问通常会让目标数组的容量足够大,最少为源数组的有效字符数+1。) ~ 用法:strlen(s),在调用这个函数时需要头文件调用库,其返回值为无符号长整型数据,用于统计有效数字的个数。通过定义begin;) ~ 用法:strcmp(s1,s2)将s1的地址所对应的数据与s2的地址所对应的数据进行做差,大于为正小于为负等于为0;字符型数组:用于存放字符的数组,其本质是字符串。
2024-07-23 18:57:32 757
原创 学习一维数组和三种排序方式
数组越界就是数组的下标变量的取值超过了初始定义的大小,导致对数组元素的访问出现在数组的范围之外越界的结果,可能会拿到不确定的值或者会导致程序报错冒泡排序就是通过一次又一次的比较,将数组排序成我们想要的顺序(从大到小或者从小到大)
2024-07-22 22:01:23 218
原创 循环语句和跳出语句的学习
用途: 主要用于复杂的流程控制或错误处理,如在深度嵌套的循环中跳出多层循环或处理异常情况。这种跳转是直接的、无条件的,不考虑程序中的函数调用或块的范围。用途: 主要用于在循环内部的某个条件达成时提前退出循环,通常用于避免无限循环或在已达到所需条件后停止执行循环体内的代码。特点: for 循环提供了一个结构化的方式来指定初始化、条件检查和循环体后的更新操作,通常用于已知循环次数的情况。用途: 保证至少执行一次循环体的情况,适合于需要先执行一次操作再检查条件的场景,例如菜单选择或循环处理用户输入。
2024-07-20 17:20:05 183
原创 关系运算符和逻辑运算符,if语句,switch语句以及条件语句的学习
switch内的表达式仅支持整型或者与整型兼容的数据类型,case后的表达式只能为常量,且每个case操作后面放置的常量不能相同否则会相互矛盾。特殊提醒:在使用逻辑运算符编写时,若前面逻辑运算符左边的表达式已然决定了逻辑运算表达式的真假,系统会从自动中断运行不会执行该表达式后面剩余的操作这种操作称为表达式中断。if根据语句1的条件进行判断若为真则进行存放目的代码1的操作,若为假则进行存放目的代码2的操作.一、关系运算符:< ,> , = , == ,!if (表达式) 语句1。
2024-07-19 20:32:47 310
原创 C语言中的字符输入输出函数,输入输出函数和占位符的学习
用法: scanf(“%d”,&i)————使用“&i”的原因是在被调函数中不能修改主调函数,这两者是相互独立的不提供地址,scanf会创建一个新的临时副本,改变这个副本不会影响原始变量。用法为: printf(“XXXX%d”,i)————"XXXX"自己想写啥写啥,%d可以变成自己需要的占位符由i决定且应与i的个数一致。int putchar (int c) ———— “int c”为ASCII编号或者字符本身;用法为:putchar('a')————a为任意字符,即可完成输出字符;
2024-07-18 19:40:15 339
原创 变量赋初值,类运算符和表达式,不同数值型数据间的混合运算混合赋值学习
在算术表达式中/和%这两类组成的表达式是比较特殊的,这俩类组成的表达式右操作数不能为0,如果是0程序直接从此表达式中断(程序崩溃)。(2)定义变量i,然后i++,则会输出i的值没有输出加一后的结果,因为i++是先把i的内容进行拷贝然后建立一个匿名变量(临时变量),然后对i进行加一操作,与++i不同的是i++输出的是这个临时变量的内容而不是i的内容。作用:若输出++i,则i本身立即加1然后输出加一后的处理结果,因为++i是仅对i的存储单元进行操作,表达式虽然是++i但实际上还是输出的是i这个变量。
2024-07-17 19:52:32 1884
原创 C语言中的标识符的命名规范以及整型,浮点型,字符型数据类型的学习
分配的空间大小由其变量类型决定其分为:short,unsigned short,int, unsigned int, long,unsigned long,long long,unsigned long long这八类。无符号的整型变量类型有:unsigned short(无符号短整型),unsigned int(无符号基本整型),unsigned long(无符号长整型)。无符号的整型变量类型有:short(有符号短整型),int(有符号基本整型),long(有符号长整型)。(1)有符号的整型变量类型。
2024-07-16 19:31:58 399
原创 Linux 命令指示符的学习,C语言数据类型以及变量与常量学习。
(6)"rm"用于删除文件或者文件夹,用法为"rm + 文件名"用于在当前目录下删除文件以及"rm + 目标目录的(绝对/相对)路径/文件名 "用于在指定目录下删除文件。(8)"cp"用于把源文件拷贝到目标目录下,用法为"cp + 源文件的(绝对/相对)路径 + 目标目录的(绝对/相对)路径",若操作对象为文件夹则完成前述操作后在指令后面输入"-r"即可完成删除文件夹操作。(1)"ls"用于将目录列表展开了解所展开目录的内容,用法为"ls + 目标目录的(绝对/相对)路径"。3、大致了解ram和rom。
2024-07-15 19:27:27 208
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人