- 博客(28)
- 收藏
- 关注
原创 线程安全及学习
上述这些函数成功返回0,失败则返回错误码;pthread_mutex_destroy函数用于销毁互斥锁,以释放其占用的内核资源.销毁一个已经加锁的互斥锁将导致不可预期的后果.
2025-04-06 11:51:40
415
原创 线程同步的学习与应用
运行结果出错!!!而wg++不是一个原子操作;这种情况也不是每一次都发生,也不是一定发生了多少次.这种情况就是最可怕的,给人的感觉是时对时错;注意,只有一个处理器的时候这种情况出现的概率是非常小的,同一时刻只有一个线程在运行,不容易出现两个线程同时去获取i的值的情况,但是也会发生;
2025-04-06 10:57:44
436
原创 使用消息队列实现进程通信
1)msgget2)msgsnd3)msgrcv4)msctl3.消息队列的使用---代码演示进程 a 发送一条消息,进程 b 读取消息。演示发送消息,接收消息;结论:1).没有0号消息;0表示顺位接收;不管什么类型的消息都接收,因为没有0号消息,只有>=1的消息;2).可以使用ipcrm 删除消息队列,也可以在程序中删除;方法一: ipcs -q /-m/-s 查看 ipcrm -q/m/s id 删除方法二: 3).如果设置成IPC_NOWAIT,
2025-03-30 15:07:19
370
原创 使用共享内存实现进程通信和同步
进程a向共享内存写入数据(写一次hello),进程b从共享内存读取数据(读取hello)并显示.main.c写入数据test.c读取数据。
2025-03-29 12:31:37
235
原创 使用信号量实现进程同步(多个信号量)及共享内存
共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物 理内存上申请一块空间,多个进程可以将其映射到自己的虚拟地址空间中。所有进 程都可以访问共享内存中的地址,就好像它们是由 malloc 分配的一样。如果某个进 程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他 进程看到。由于它并未提供同步机制,所以我们通常需要用其他的机制来同步对共享内存的访问。1)shmgetshmget()用于创建或者获取共享内存。
2025-03-29 11:18:57
336
原创 使用信号量实现进程同步
信号量就是控制某个进程能够对某个资源进行访问;保证同一时刻只能由一个进程对某个资源进程访问;信号量是一个特殊的变量,对信号量的操作都是一个原子操作;打印机信号量是一个特殊的变量,一般取正数值。它的值代表允许访问的资源数目, 获取资源时,需要对信号量的值进行原子减一,该操作被称为 P 操作。当信号量值为 0时,代表没有资源可用, P 操作会阻塞。释放资源时,需要对信号量的值进行原子加一,该操作被称为 V操作。信号量主要用来同步进程。信号量的值如果只取 0,1, 将其称为二值信号量。
2025-03-28 10:03:14
368
原创 基于Linux下的MyBash命令解释器
字符串分割函数注意:strtok线程不安全,原因就是函数实现使用了一个static的变量(指针记录下次分割的地址,再次调用要沿用上次的,所以需要静态变量).在多线程中,如果两个线程都使用了strtok的话,这个变量的值就会被另一个线程不定期的进行修改.基于Linux内核的命令解释程序(Shell),设计了⼀个⾃⼰的MyBash命令解释器。实现 了⼤致的程 序总框架,系统命令提⽰符显⽰,对⽤⼾输⼊命令的解析和执⾏,其中区别了系统的内 置命令和外置命令。
2025-03-25 12:59:29
982
原创 fork+exec进程创建
ececl,execlp,execle,execv,execvp //库函数execve //系统调用//pathname:新替换的程序的路径+名字//arg :传给新程序主函数的第一个参数,一般为程序的名字//arg 后面是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数//系统调用//前五个是库函数,最后一个是系统调用,所以本质上上面5个都是通过第六个系统调用实现的也就是说,上。
2025-03-23 10:49:02
807
原创 信号的学习和应用
所以,man kill是1命令,man 2 kill才是系统调用;man 2 kill得到原型:就是向PID为pid的发送sig信号;返回值为-1说明失败,0表示成功.
2025-03-22 15:32:21
711
原创 fork与信号
信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作;与信号有关的系统调用在<signal.h>头文件中.1)信号的存储位置旧版新版(23版)2)常见信号对应的功能SIGABORT *进程异常终止SIGALRM 超时警告SIGFPE *浮点运算异常SIGHUP 连接挂断SIGILL *非法指令SIGINT 终端中断。
2025-03-22 12:48:12
839
原创 fork,写时拷贝
1.为什么会有缓冲区的存在?2.演示及思考?1).演示缓存区没有存在感那为什么我们感觉不到缓冲区的存在呢?我们要打印东西直接就打印了呢?我们用代码演示一下:我们运行的之后直接就打印了hello,好像没有感觉到缓冲区 的存在;原因是因为此时程序已经结束了,它会刷新缓冲区的内容;2)演示缓冲区的存在3.强制刷新(1)方法一:遇到\n自动刷新(2)使用fflush刷新屏幕4.exit是先刷新缓冲区,然后再调用_exit(真正的退出);
2025-03-19 11:05:36
574
原创 静态库,共享库,计算机基础知识
当你同时运行许多应用程序并且它们都使用来自同一个函数库的函数时,内存中就会有同一函数的多个副本.而且在程序文件自身中也有多份同样的副本,这将消耗大量宝贵的内存和磁盘空间;而静态库,就是这10个应用程序都包含了这个库文件,那么10份的库文件都放在磁盘上了(占用磁盘空间),而且运行加载的时候占用内存空间(10份库文件都要加载);共享库如果10个应用程序共享,那么磁盘上只有一份共享的库文件,而且运行加载时在内存中只加载了标记了的这一份库文件;一个时间段,称作它的时间片,即该进程允许运行的时间。
2025-03-18 10:28:28
589
原创 进程管理,用户管理,文件压缩命令
比如有两个文件:main.c,mainc++.cpp(分别用C语言和C++语言写的)如果要用gcc编译呢?gcc -o mainc mainc++.cpp -lstdc++ 指明用c++的标准库;区别一:gcc默认只链接C库,并不会链接C++的库;g++会默认链接c++标准库.区别二:gcc编译.c文件,则按照C语言的方式编译;gcc如果编译.cpp文件,则按照c++的方式编译;g++不管是c文件还是cpp文件,都是按照c++的方式进行编译;
2025-03-17 15:36:21
605
原创 gcc和gdb具体使用
路径+可执行文件名或者路径+可执行文件名 & (将进程放到后台执行);可以把可执行文件放到 /usr/bin 就可以省略路径了;
2025-03-17 10:24:34
872
原创 编译链接和gcc
(1)预编译阶段a)删除所有的"#define",并且展开所有的宏定义;b)处理所有的条件预编译指令,"#if","#ifdef","#endif"等;c)处理"#include"预编译指令,将被包含的文件插入到该预编译指令的位置;d)删除所有的注释;e)添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和警告时显示行号;f)保留所有的#pragma编译器指令,因为编译器需要使用它们;(2)编译阶段词法分析,语法分析,语义分析,代码优化,汇总符号。
2025-03-16 19:30:53
909
原创 常见的基础命令
ls补充:理解使用:-A 显现除 “.”和“..”外的一切文件。-m 横向输出文件名,并以“,”作分格符。-o 显现文件的除组信息外的具体信息。-R 列出一切子目录下的文件。-s 在每个文件名后输出该文件的大小。-k 以 k 字节的方式表明文件的明细。--color=no 不显现五颜六色文件名--color 显现五颜六色文件名(不写也显现颜色,因为ls二进制程序带了颜色)--help 在规范输出上显现协助信息。
2025-03-16 11:47:30
526
原创 函数递归的学习与应用
汉诺塔问题:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到B座,但规则是每次只允许移动一个盘子,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动的过程中可以利用B座。要求编写程序输出移动盘子的步骤。递归算法相比循环算法时间复杂度更大,O(n^2和O(n)。所以斐波那契数列是最不适合递归的例子。
2024-03-28 15:38:52
151
原创 解决进制问题的方法学习
例题二:假设在n进制下,下面的等式成立,567*456=150216,n的值是()。例如:48/16=3,3/16=0;对于右边 因为n大于6,所以(1+6/n)还是小于n,(1+6/n)%n=1。同时除n,在进行取余得到:(71+42/n)%n= (1+6/n)%n。因为选项n都比6大,故对6取余为6 ,找42对选项哪一个取余为6。1.取出最后没有n的数,对n取余42%n = 6%n。即(71+42/n)%n= (1+6/n)%n=1。
2024-03-26 00:44:40
314
原创 引用的学习与应用
C++新增了一种复合类型--引用。引用时已定义的变量的别名。例如将data作为value的引用(别名),则可以随意使用data或value来表示该变量。引用有何作用?其主要作用时作为函数的形参(和函数的返回值)。这样函数的形参就是实参本身,而不是其副本。这样除指针外,引用也是为函数处理大型结构提供了一种非常方便的途径,同时对于设计类来说,引用也是必不可少的。
2024-03-16 22:22:04
1290
1
原创 字符串的学习与应用
用单引号包括一个字符,如:"a","1":字符类型的数组,如:char arr[10];:用双引号包括字符序列,可以是0个或者多个字符序列,如:"abcd","1234ab"注意:字符串有一个隐藏的"\0"作为结尾标记,在定义数组时注意长度问题注意:如果字符数组包含"\0"那么它也是字符串,如果字符数组不包含”\0"它就不是字符串。
2024-03-14 22:56:47
602
1
原创 初始C++
第一个C++的程序执行如下:#include<iostream> // 包含标准的输入和输出头文件iostream。//使用标准命名空间std。cout<<"你好,世界" <<endl;//向标准输出设备(屏幕)输出信息,cout是用于输出信息的流对象。endl表示换行,类似C语言中的"\n"。
2024-03-13 17:45:30
336
原创 动态内存的创建和释放
生存周期:进入函数创建,退出函数销毁void:没有,可以修饰返回值或者形参列表void*:通过指针,仅仅只标记地址,不包含类型信息应用场景:1.需要根据变量作为长度定义数组2.函数结束后还需要继续使用的内存(例如返回局部数组的地址,链表)3.长度较大的数组(大内存,超过1M的大小)
2024-03-11 18:44:23
384
原创 Swap数据交换
定义在函数内部的变量,包括形参。只在函数内部有效,默认值为随机值;:定义在函数外部的变量,整个文件都能使用。尽量不使用全局变量;程序执行结果:。
2024-03-10 17:46:16
436
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人