- 博客(27)
- 收藏
- 关注
原创 DAY 30
有名管道为 Linux 中的进程通信提供了一种灵活且强大的方式,熟练掌握其使用对于开发高效的多进程应用程序至关重要。进程可以阻塞某些信号,使其暂时不被处理。被阻塞的信号会处于未决状态,直到解除阻塞后才会被处理。信号是软件中断,用于通知进程发生了特定的事件。每个信号都有一个唯一的编号和预定义的默认操作。有名管道是一种具有特定文件名的特殊文件,存在于文件系统中。创建有名管道后,可以像操作普通文件一样使用文件 I/O 函数进行读写。例如,一个进程以写模式打开有名管道。是指定的管道文件名,用于设置文件的权限。
2024-08-17 20:53:35
251
原创 【无标题】
V操作逻辑:释放一个资源,然后检查是否有等待该信号量的进程。如果有等待进程,那么从 等待队列中唤醒一个或多个进程,具体唤醒的数量取决于信号量的设置和等待队 列的情况。pipefd :用来获取 管道的两端 (读端pipefd[0] / 写端pipefd[1])3.信号量的PV操作(核心):sem_wait()/ sem_post()P操作逻辑:尝试获取资源,有资源可用时直接使用,资源个数减一,
2024-08-16 19:25:17
209
原创 DAY 28
例如,并发执行的进程P1P2分别申请并占有了资源 R1、R2,之后进程P1又紧接着申请资源R2,而进程P2又申请资源R1,两者会因为申请的资源被对方占有而阻塞,从而发生死锁。3、请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己己有的资源保持不放。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资源(CPU)的竞争是不会引起死锁的。通过对信号量的操作,可以实现线程间的顺序执行和资源的合理分配。3.死锁的检测和解除。
2024-08-15 19:39:30
274
原创 DAY 27
一、1.wait 和 waitpid都是 等待子进程状态改变2.wait是一种阻塞调用3.waitpid 可以实现非阻塞调用二、1.创建---fork//创建一个子进程//创建多个子进程//创建好之后,能区分父子进程代码的逻辑2.执行a.做与父进程相同的事情b.做与父进程不同的事情3.进程的退出returnexit_exit4.两个特殊状态孤儿进程---没有危害,不需要处理僵尸态进程---处理工waitwaitpid。
2024-08-14 18:27:27
640
原创 DAY 26
在 Linux 中,exec 函数族用于在一个进程中执行另一个程序。当进程调用 exec 函数时,该进程的用户空间代码和数据将被新程序替换,从新程序的启动例程开始执行。调用 exec 并不创建新进程,所以调用 exec 前后该进程的 ID 并未改变。exec 函数族包括以下几种函数:这些函数的区别如下:需要注意的是,exec 函数只有在调用出错时才会返回 -1,成功执行新程序后不会返回。此外,在使用 exec 函数时,需要确保提供的文件路径或文件名正确,以及参数和环境变量的设置符合要求。
2024-08-13 21:20:34
234
原创 DAY 25
进程的主要作用是实现并发,提高系统资源的利用率。例如在无人机系统中,通过进程可以同时实现控制、视频、传输、存储等多个任务的并发执行。进程是程序的一次执行过程,它包含了程序执行所需的资源,如内存、CPU时间、文件等。每个进程都有自己独立的地址空间和执行上下文。内核的主要功能之一是完成进程调度,宏观上实现并行,微观上实现串行。调度算法包括LRU(最近最久未使用)等。
2024-08-12 19:14:58
346
原创 DAY 22
vim 编辑器,gcc 编译器 ,gdb 调试器 make。根据用户id到/etc/passwd文件下解析获得。根据用户名到/etc/passwd文件下解析获得。根据gid到/etc/group文件中解析组信息。根据组名到/etc/group文件中解析组信息。创建一个链接向oldpath文件的新符号链接文件。1,打开 open(,“”): fd,oldpath:被链接向的文件的路径。newpath:创建的新硬链接文件。pathname:删除文件的路径。
2024-08-08 19:30:07
391
原创 DAY 21
int stat(const char *pathname, struct stat *statbuf(文件属性)) <类stat,ll命令>char *getcwd(char *buf,size_t size(本次接收的最大长度)) <类pwd命令>int mkdir(const *pathname,mode_t mode) <类mkdir命令>int *rmdir(const *pathname) <类rm命令>int chdir(const char *path) <类cd命令>
2024-08-07 21:55:19
207
原创 DAY 20
O_EXCL,需要和O_CREAT同时使用,表示新建的文件不能存在,成功,否则open就会失败。行缓冲,1k, terminal,主要用于人机交互stdout。功能:将stream流文件中的文件指针从whence位置开始。whence 偏移的起始位置,由系统定义的三个宏开始。使用gdb查看,FILE结构体,或使用写入数据测试缓冲区。offset 要在文件内偏移的距离,单位字节。注意:不支持设备文件,一般用于普通文件。O_ASYNC异步io,什么时候io不确定,.2 操作对象不在是流,而是文件描述符。
2024-08-06 19:47:35
314
原创 DAY 19
一般都是对普通文件操作是一种有缓存的IO 在文件IO和用户程序之间,加入缓冲区,可以有效减少系统调用的效率,节省系统IO调度资源。功能:从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr。功能:从stream流对象关联的文件中获取size大小字节的文本数据。功能:从s所在的本地内存中获取一行数据,并写入stream对应的文件。写到终端屏幕显示,如果是fp的普通文件则会写入到文件中。nmemb 要获取的数据块的个数,拷贝的数据块个数。3.fgets会读到n个数据,如果n个。
2024-08-05 20:06:59
423
原创 DAY 18
Shell 脚本是一种解释型的脚本语言,它由一系列命令组成,这些命令按照特定的顺序执行,以完成特定的任务。Shell 脚本可以在 Linux 终端中直接运行,也可以通过脚本解释器来执行。
2024-08-03 18:41:13
280
原创 DAY 16
结构体是由若干个成员组成的数据集合,每个成员可以具有不同的数据类型。struct 结构体名 {成员列表定义结构体变量的方式先定义结构体类型,再定义结构体变量,例如:在定义结构体类型的同时定义结构体变量,例如:int id;} stu2;直接定义结构体变量,例如:struct {int id;} stu3;初始化结构体变量:可以在定义时进行初始化。
2024-08-01 19:26:13
571
原创 DAY 15
需要注意的是,指针的数据类型不仅决定了它所指向的数据的类型,还决定了指针进行运算时的步长。例如,指向整数的指针的数据类型是“整型指针”,指向字符的指针的数据类型是“字符型指针”。指向指针的指针的主要作用是通过多级指针的间接寻址,实现对数据的更复杂的操作和管理。总之,指针的数据类型和指针运算是 C 语言中非常重要的概念,它们为程序员提供了一种直接操作内存的方式,使得程序能够更加高效地运行。在C语言中,指向函数的指针是一种特殊类型的指针,它指向的是函数的入口地址。是指针所指向的指针所指向的数据的类型,
2024-07-31 18:54:56
538
原创 DAY 14
总之,指针在C语言中是一个非常强大的工具,但也需要谨慎使用。在使用指针时,需要注意内存管理、指针的合法性等问题,以确保程序的正确性和稳定性。同时,指针与函数、结构体的结合使用可以实现更加复杂的功能,提高程序的灵活性和效率。
2024-07-30 20:10:58
111
原创 DAY 12
不带参数的宏定义定义形式#define 标识符 字符串作用:在程序中用指定的标识符代替字符串,减少重复书写,提高通用性。注意事项:宏名一般用大写字母,不作正确性检查,不加分号,有效范围为定义命令之后到本源文件结束,可用#undef命令终止其作用域,可层层置换,对双撇号内的字符不进行置换,不分配内存空间。带参数的宏定义定义形式#define 宏名(参数表) 字符串展开方式:将语句中的宏名后面括号内的实参字符串代替#define。
2024-07-27 20:59:13
383
原创 day 11
当我们将数组作为函数参数传递时,实际上传递的是数组的首地址,也就是一个指针。学习内容就这些,我们今天主要是进行了大量代码的编译,通过大量编程来提高自己编程的熟练度,这让我们度过了非常充实的一天。数组长度的传递:由于传递的只是数组的首地址,函数并不知道数组的实际长度。数组的边界:在函数内部操作数组时,必须小心不要超出数组的边界,否则可能导致未定义的行为,例如访问非法内存。二维及多维数组作为参数:对于二维及多维数组,传递方式稍微复杂一些。数组参数的常量性:如果希望在函数内部不修改数组元素,可以将参数声明为。
2024-07-26 18:49:18
171
原创 DAY 10
递归调用在解决某些问题时可以使代码更简洁和直观,但需要注意的是,如果递归深度过大,可能会导致栈溢出错误。同时,对于一些可以用迭代(循环)方式更高效解决的问题,应尽量避免使用递归,以提高程序的性能。而局部静态变量存放在局部静态区,它的作用域在定义它的函数内部,但生命周期和程序的运行时间相同。它的分配和释放是自动进行的,遵循先进后出的原则,空间相对较小,操作速度快。函数的嵌套调用指的是在一个函数的执行过程中,调用另一个函数。被调用的函数执行完毕后,将结果返回给调用它的函数,然后继续执行调用函数中后续的代码。
2024-07-25 17:47:48
141
原创 DAY 9
返回值在 C 语言的程序设计中非常重要,它有助于将复杂的任务分解为多个小的、可复用的函数,并实现函数之间的信息传递和交互。函数的返回值类型在函数定义时指定。这样,在使用函数的地方,编译器就能够知道函数的存在以及其基本的信息,从而进行正确的编译和检查。在 C 语言中,函数声明用于告诉编译器函数的名称、返回值类型以及参数的类型和数量。在 C 语言中,要调用已定义的函数,需要使用函数名并提供相应的参数(如果函数有参数的话)。需要注意的是,调用函数时提供的参数类型和数量必须与函数定义时的参数类型和数量相匹配。
2024-07-24 19:46:26
128
原创 DAY 8
一、重点讲了字符数组,所谓字符数组就是定义一个字符数组,用来装字符串。字符串的长度要大于实际字符个数。早上一开始讲了二分查找法:二分查找法是左边先将数组进行排序,右边利用二分法,来与想查找的数进行对比。今天的主要学习内容就是这些,更多的还是需要练习,多上手编程。1、scanf中的空格会被间隔符,后面的字符就无法输入。2、gets 容易因为输入字符过多,导致越界访问。3.字符串拷贝(strcpy)4.字符串连接(strcat)5.字符串比较(strcmp)二、字符串数组里会用到的算法。3、fgets函数。
2024-07-23 19:18:39
193
原创 DAY 5
冒泡排序:从第一个元素开始,与第二个元素比较大小,将较小的元素放在左边,然后将第二个与第三个比较,继续将较小的数放在左边,以此类推,直到第len - 1 与 第len个比较完,第一轮比较结束。从第二个元素开始,与第一个元素比较,若第二个数大,交换位置,然后从第三个数开始,与第二个数比较,在与第一个数比较大小。1、选择排序:从数组中第一个元素开始,依次和后面的数比大小,然后根据结果按要求互换位置,直到和最后一个数比完结束。
2024-07-22 20:57:37
99
原创 DAY 5
从当前所在循环中跳出,提前结束当前语句,break之后的语句不执行。需要注意的是不能在for表达式后加分号,其执行的是第一次是表达式为假时的结果。还有就是循环的嵌套中,内层循环比外层循环跑得更快。在for循环中比较重要的就是嵌套循环语句,它需要将多个循环语句进行嵌套,在使用for循环语句的时候要注意内部代码的位置。先执行一次指定的循环体语句,再判别循环条件是否成立。其中表达式2为逻辑条件语句,是判断循环是否继续执行和终止循环的重要语句。while为" 当型 ",当表达式非0时,执行语句;
2024-07-21 14:35:50
106
原创 DAY 5
今天下午主要对if语句和switch语句进行了系统的学习,并进行了很多的编程训练,对这两种语句加强掌握。关系表达式:关系表达式是由关系运算符连接两个操作数所构成的表达式。关系表达式的结果为整数类型,即 0(表示假)或 1(表示真)今天上午学习了关系运算符、关系表达式,逻辑运算符和逻辑表达式。如果操作数为假,则结果为真。逻辑表达式由逻辑运算符&&(逻辑与)、||(逻辑或)和。只要两个操作数中有一个为真,结果就为真。只有当两个操作数都为真时,结果才为真。3、>= :大于等于。2、|| (逻辑或)
2024-07-19 19:58:53
183
原创 DAY 4
这里的 %d 用于指定输入的数据类型为整数,并需要提供变量的地址(使用 & 运算符)来存储输入的值。使用 getchar 函数从标准输入读取一个字符,使用 putchar 函数向标准输出输出一个字符。在下午的最后时间里,我们利用今天所学的知识进行了简单代码的编写,对其融会贯通,加强理解。14.%g :根据数值的大小,自动选择 %f 或 %e 格式输出,使输出更简洁。今天学习了函数的输入与输出函数,字符的输入与输出,还有格式控制符的作用。8.%x :以十六进制形式输出整数,字母小写。
2024-07-18 18:46:48
203
原创 DAY 3
int = unsigende short 扩展的高位还是取决于符号位,因为是无符号类型,则其没有符号位,是数值,则将其补0。short = int short字节太小,无法全部保留,所以会进行高位截断,低位保留。int = short 可以装下,正整数多出来的空位补为0高位,负的多出来补FF高位。今天主要学习了C语言变量赋初值,混合赋值,以及运算符的运用和混合运算。1、赋值:可以在定义的时候直接进行赋值,也可以先定义,再进行赋值,=,+=,-=等:赋值运算符。混合运算时的隐式转换。
2024-07-17 18:16:24
141
原创 第二天总结
然后对于上述用法,我们进行了C语言程序编写的实操,对其加深印象,之后对ASCII码表的内容进行的C语言程序上的简单运用,比如大小写字母之间的相互转换。最后利用今天所学的知识进行了简单的编程,结束了今天的学习。今天一整天对C语言的进制变换和基础代码中的“\”的用法进行了系统的学习。\xhh:1到2位十六进制数所代表的字符。\b:退格,将当前位置移到本行开头位置。\ddd:1到3位八进制数所代表的字符。\':代表一个“ ' ”字符。\":代表一个“ " ”字符。\\:代表一个“\”字符。
2024-07-16 17:58:02
89
原创 FIRST DAY
再者,对C语言进行了简单的代码编写,今天课程较为简单,学起来轻松一点,明天继续努力。早上老师讲了关于嵌入式的一些历史和相关知识,下午讲了Linux系统的一些简单相关指令。cp ./地址名/文件名 ./地址名 将文件或目录拷贝到另一个地址中。ls -al 查看当前目录下的所以文件的详细内容。mv 文件名 地址名 将文件转移到另一个地址中。ls -l 查看当前目录下的文件的详细内容;ls -a 查看当前目录下的所有文件;rm文件地址 删除文件。rm目录地址 删除目录。如:ls 查看当前目录下的文件;
2024-07-15 18:48:09
146
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人