
Linux
文章平均质量分 58
雪星猫宇
这个作者很懒,什么都没留下…
展开
-
多线程同步
线程同步指的是当一个线程在对某个临界资源进行操作时,其他线程都不可以对这个资源进行操作,直到该线程完成操作, 其他线程才能操作,也就是协同步调,让线程按预定的先后次序进行运行。多线程并发就有可能出现问题的,比如两个线程都去在链表中插入,比如都在做尾插,都在找尾巴,那么多线程就会出问题;怎么解决这个问题呢?注意,只有一个处理器的时候这种情况出现的概率是非常小的,同一时刻只有一个线程在运行,不容易出现两个线程同时去获取i的值的情况,但是也会发生;.线程同步的手段就是对线程之间的穿插进行控制.原创 2024-04-29 23:58:01 · 2049 阅读 · 1 评论 -
Linux--线程
8.还有一种不太好的办法,就是不要退出进程了,退出线程.使用pthread_exit函数;原创 2024-04-22 00:00:00 · 2312 阅读 · 0 评论 -
进程间通信--消息队列
msgget()创建或者获取一个消息队列msgget()成功返回消息队列 ID,失败返回-1。原创 2024-04-18 23:05:58 · 215 阅读 · 0 评论 -
进程间通信--共享内存
原创 2024-04-16 23:59:15 · 347 阅读 · 0 评论 -
进程间通信--信号量
信号量就是控制某个进程能够对某个资源进行访问;保证同一时刻只能由一个进程对某个资源进程访问;信号量是一个特殊的变量,对信号量的操作都是一个原子操作;打印机信号量是一个特殊的变量,一般取正数值。它的值代表允许访问的资源数目, 获取资源时,需要对信号量的值进行原子减一,该操作被称为 P 操作。当信号量值为 0时,代表没有资源可用, P 操作会阻塞。释放资源时,需要对信号量的值进行原子加一,该操作被称为 V操作。信号量主要用来同步进程。信号量的值如果只取 0,1, 将其称为二值信号量。原创 2024-04-16 23:58:26 · 239 阅读 · 0 评论 -
mybash---打造自己的命令解释器
字符串分割函数注意:strtok线程不安全,原因就是函数实现使用了一个static的变量(指针记录下次分割的地址,再次调用要沿用上次的,所以需要静态变量).在多线程中,如果两个线程都使用了strtok的话,这个变量的值就会被另一个线程不定期的进行修改.原创 2024-04-15 22:06:10 · 2265 阅读 · 0 评论 -
进程创建示例
当前主程序main通过fork复制产生一个子进程,子进程用新程序"newmain"替换自身;(newmain:打印参数内容和环境变量)我们发现执行不到这一句,因为去执行ps去了,然后从ps退出进程了,除非execl执行失败.exec系列单独是能使用的,但是没有多大意义.通常我们会结合fork一起使用;原创 2024-04-09 21:38:07 · 287 阅读 · 0 评论 -
进程替换的应用
写一个程序main.c,运行起来之后替换执行test程序(test打印参数内容)原创 2024-04-08 22:36:19 · 100 阅读 · 0 评论 -
进程替换exec系列介绍
/pathname:新替换的程序的路径+名字//arg :传给新程序主函数的第一个参数,一般为程序的名字//arg 后面是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数//系统调用//前五个是库函数,最后一个是系统调用,所以本质上上面5个都是通过第六个系统调用实现的也就是说,上面5个都是调用的execve,不过都是把参数放进数组,然后把数组传递给这个系统调用execve;也就是说,这些方法没有本质区别;也就是说,本质上只有一个替换方法,就是execve;原创 2024-04-08 22:34:47 · 2316 阅读 · 0 评论 -
linux--进程创建
替换,这里就体现了写时拷贝的意义,如果全部都要替换,那么最开始的复制是没有意义的;注意,用了写时拷贝就只复制了几个页表的映射,内容还没有复制,然后执行了替换exec.实际上Linux上这个bash就是不断的复制自身,然后把复制出来的用exec替换成想要执行的程序(比如ps);运行ps,发现ps是bash的一个子进程;原因就是bash把自己复制一份,然后替换成ps;执行了3次ps -f ,ps -f的父进程的ID(PPID)都是一样的,即bash.在Linux新的进程的产生过程(原创 2024-04-06 16:14:27 · 294 阅读 · 0 评论 -
SIGCHLD信号
(2).父进程调用wait()方法获取子进程的退出码 父进程获取子进程的退出码之后,操作系统就将这个子进程的PCB删除了,就不会产生僵死进程了. 两个方法的本质是一样的,但是方法二会阻塞,就是父进程在。由执行结果可以看出,子进程结束,确实是会给父进程发送17号信号SIGCHLD;那么在这里,我们修改一下代码,让父进程收到子进程的代码,打印一下收到的信号代号,不要忽略掉;而且我们也可以简单写,就是不获取退出码,我们只要不变成僵死进程就可以;(1).父进程先结束(孤儿进程会被收养)子进程结束,才会获取退出码.原创 2024-04-06 16:12:02 · 284 阅读 · 0 评论 -
信号的应用举例之自己实现kill命令
运行sleep 500这个进程,发现使用自己的mykill命令发送15号信号显示的是"已终止(Terminated)",发现使用自己的mykill命令发送9号信号是"已杀死(killed)",那有人又说kill命令没有传递信号代号,其实是一样的,也就是mykill传递两个参数即可,把信号代号也就是argv[2]定义成15,或者9即可.自己实现kill命令,需要PID,需要信号代号.就是我们也要写一个类似kill -9 PID 的命令;9号信号是一个特殊的信号,它是不允许改变响应方式的.原创 2024-04-05 21:00:16 · 532 阅读 · 0 评论 -
linux--信号
信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作;与信号有关的系统调用在<signal.h>头文件中.用signal修改SIGINT信号的响应方式示例如下int main()while(1)sleep(1);exit(0);那如何结束该进程呢?方法一:打开另外一个终端,通过ps -ef|grep main这个命令找到该进程的pid,然后kill掉它.方法二:当然,我们也可以ctrl+,这个是终端退出的信号;原创 2024-04-05 20:56:50 · 605 阅读 · 0 评论 -
面试题目--fork
文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。(3)先fork再打开文件父子进程是否共享偏移量?在 (1)fork 之前打开的文件,在复制进程后,父子进程共享文件偏移量,所以文件指针在相同位置。(1)fork 以后,父进程打开的文件指针位置在子进程里面是否一样?(3)先fork再打开文件,父子进程各自打开各自的,不共享偏移量;父进程打开文件以后,fork产生子进程,父子进程共享打开的文件,同时共享文件偏移量;原创 2024-04-04 16:30:25 · 355 阅读 · 0 评论 -
实现类似cp命令
【代码】实现类似cp命令。原创 2024-04-04 16:23:46 · 193 阅读 · 0 评论 -
Linux操作文件的底层系统调用
open重载:两个参数用于打开一个已经存在的文件;三个参数的用于新建一个文件,并设置访问权限;pathname:文件的路径和名称;flags:文件的打开方式;mode:文件的权限,如"0600";open的返回值为int,称为文件描述符;flags的打开标志,如: O_WRONLY:只写打开;O_RDONLY:只读打开;O_RDWR:读写方式打开;O_CREAT:文件不存在则创建;O_APPEND:文件末尾追加;O_TRUNC:清空文件,重新写入;原创 2024-04-03 11:54:48 · 350 阅读 · 0 评论 -
僵死进程(僵尸进程)
1)父进程先结束;2)父进程调用wait()方法获取子进程的退出码;其实两种处理僵死进程的方法本质都是一样的,都调用了wait获取子进程退出码(方法一是父进程先结束后子进程被Init(现在随着内核的发展不一定是1)收养,Init之后调用wait获取子进程退出码;方法二是父进程直接调用wait,)但是两种方法又有区别,就是父进程调用wait会阻塞,等子进程执行完之后,父进程才会执行.若想父进程调用wait不阻塞,那么我们需要结合信号一起.具体在信号那一节用代码演示;原创 2024-04-03 11:50:35 · 597 阅读 · 0 评论 -
进程的地址
32位系统上,都有一个0-4G的地址空间: 在Linux系统上,最上面这1G由内核使用,下面3G是用户在使用;也就是说A进程和B进程的逻辑地址相同,就不能说明物理地址一定相同,我们还需要看各自的页表,看看页表是否相同.(页表就是逻辑页和物理页的映射关系);以前我们的程序都是只有一个进程,我们逻辑地址相同,那么我们的逻辑地址映射过去的物理地址肯定也是相同的一块空间,我们在进程中看到的地址就是进程的逻辑地址(进程的4G空间,从0开始,一直往上增长);我们先来看代码: (打印n的地址)而我们把所有的地址都编号,原创 2024-04-02 21:41:15 · 335 阅读 · 0 评论 -
写时拷贝技术
所以我们对fork复制进程的过程就做了一个优化-----写时拷贝技术;不采用写时拷贝,如何fork?原创 2024-04-02 21:36:29 · 211 阅读 · 0 评论 -
fork复制进程
我们就是通过命令解释器(称为shell)(bash是命令解释器中的一种)和内核和系统进行交互的(Windows通过图形界面进行交互的);fork是把已有的进程复制一份,当然把PCB也复制了一份,然后申请一个PID,子进程的PID=父进程的PID+1;父子进程是两个独立的进程,各自执行各自的代码;,而是从fork之后开始执行的,就是说fork下面的代码子进程才开始执行,具体的是说。,子进程不会再fork了,所以不会出现子进程再去fork产生一个子进程的问题.getppid:得到一个进程的父进程的PID;原创 2024-04-01 20:07:45 · 1732 阅读 · 0 评论 -
主函数的三个参数
argc:传递给主函数的参数个数argv:传递给主函数的参数列表,字符指针数组,给主函数传递的参数都是字符串;(以NULL结尾)envp:继承的环境变量列表,以NULL结尾;原创 2024-03-31 14:37:03 · 356 阅读 · 0 评论 -
prinf隐藏的缓冲区
(1)缓冲区放满(2)缓冲区未满,强制刷新缓冲区到屏幕(方法一:\n;方法二:主动刷新:fflush(stdout));(3)程序结束时,自动刷新缓冲区:exit方法;原创 2024-03-31 18:07:04 · 343 阅读 · 0 评论 -
进程的基础知识
时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配 一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程 还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结 束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用 完它的时间片后,它被移到队列的末尾。进程控制块是用一个结构体struct task_struct来实现;操作系统:管理计算机上的软硬件资源,为用户提供一个交换的接口;原创 2024-03-28 13:20:19 · 232 阅读 · 0 评论 -
计算机基础知识
(Complex Instruction Set Computer) (考点) (计算机组成原理332页:关于精简指令系统计算机,复杂指令计算机): 它是整个计算机系统的控制中心,它指挥计算机各部分协调地工作,保证计算机按照预先规定的目标和步骤有条不紊地进行操作及处理。(3) 指令周期 : cpu 每取出并执行一条指令所需的全部时间称为指令周期。:把人所熟悉的信息如,图片,声音,文字,转换为计算机能够识别的信息存储起来。(4) 指令系统 :计算机能够执行的全部指令的集合称为该计算机的指令系统。原创 2024-03-28 13:17:09 · 231 阅读 · 0 评论 -
静态库与共享库
当你同时运行许多应用程序并且它们都使用来自同一个函数库的函数时,内存中就会有同一函数的多个副本.而且在程序文件自身中也有多份同样的副本,这将消耗大量宝贵的内存和磁盘空间;而静态库,就是这10个应用程序都包含了这个库文件,那么10份的库文件都放在磁盘上了(占用磁盘空间),而且运行加载的时候占用内存空间(10份库文件都要加载);共享库如果10个应用程序共享,那么磁盘上只有一份共享的库文件,而且运行加载时在内存中只加载了标记了的这一份库文件;1)先将需要生成库文件的所有.c文件编译成.o文件;原创 2024-03-27 19:58:48 · 361 阅读 · 0 评论 -
文件压缩与解压命令
gzip my.tar (后缀名为.tar.gz)z:GNU版本新加的,使得tar有压缩和解压的功能;(2)gzip 压缩或者解压。f:指定目标为文件而不是设备;t:显示包中的内容而不释放;(新的系统x也可以一步解压)tar 将文件打包。原创 2024-03-27 19:52:15 · 295 阅读 · 0 评论 -
用户管理命令
userdel 用户名(默认仅仅删除用户,不删除家目录,不删除家目录中的文件 ,比如/home/stu 不要删除)桌面添加:右键:设置:用户,解锁,添加用户(Ubuntu建议用图形化界面添加用户)使用命令添加新用户:useradd newname。/etc/passwd:存储用户的基本信息。先转成管理员 sudo su。(一般不建议删除此文件)passwd 用户名。原创 2024-03-26 18:18:12 · 237 阅读 · 0 评论 -
进程管理命令
默认显示与当前终端有关的进程信息;参数:-e -f -L-f:显示更多的进程属性信息;-e:显示系统信息;-L:显示进程中的线程的ID;原创 2024-03-26 18:16:01 · 368 阅读 · 0 评论 -
Linux上最多可以创建多少个线程
本次实验是在虚拟机Ubuntu上测试。原创 2023-12-07 16:11:41 · 428 阅读 · 0 评论 -
Linux基础命令
i 不区分大小写(例如:grep -i "hello" file.txt) 不写就是区分大小写。(5)touch:创建普通文件(不存在则创建,存在则修改文件的属性信息:最后的修改时间)-c:统计满足要求的有几行(grep -c "hello" file.txt).拷贝目录文件的语法:cp -r 源文件路径+文件名 目的路径(需要加-r)find 搜索路径 -cmin -n(搜索过去n分钟内修改的文件);(ls -s ls -ls)移动目录文件(不需要-r):mv 源文件的路径+文件名 目的路径。原创 2024-03-22 20:31:11 · 301 阅读 · 0 评论 -
文件查看命令
2)合并文件:cat 文件名1 文件名2> 文件名3。文件内容较多时用more(空格,回车往下翻,b回滚)1)查看文件内容(内容较少时使用):cat 文件名。3)往文件中写入数据,(Ctrl+d结束输入);显示文件的前n行:head -num 文件名。显示文件的后n行:tail -num 文件名。另一个窗口:cat >> 文件名。看完内容之后不会显示到屏幕上;这样就可以看到实时文件数据;tail -f 文件名。原创 2024-03-23 22:52:20 · 186 阅读 · 0 评论 -
文件编辑命令—vim
n,m s/oldstring/newstring 替换从n行到m行的第一个oldstring(比如一行出现多个,那么只替换每一行的第一个):n,m s/oldstring/newstring/g 替换从n行到m行的所有oldstring。j:向下移动光标k:向上移动光标;d n shift +g:删除光标到n行的内容;y n shift+g:拷贝光标到n行的内容;shift+g:光标移动到文本的最后一行;shift+6:光标移动到当前行的开头;shift+4:光标移动到当前行的末尾;原创 2024-03-23 22:56:17 · 1100 阅读 · 0 评论 -
编译链接和gcc
链接阶段就是将所有的.o文件, .a文件(静态库文件), .lib文件, .obj文件链接起来,生成.out文件(ELF格式的可执行文件) (Windows是生成.exe文件)**当然就是汇编了,对汇编指令进行汇编,生成.o文件(第(3)步),即变成二进制指令(第(3) 步),最后就是链接了(第四步)**预编译生成.i文件(第一步),编译生成.s文件(第二步),即编译生成汇编指令,然后接下来。b)处理所有的条件预编译指令,"#if","#ifdef","#endif"等;原创 2024-03-25 13:41:58 · 261 阅读 · 0 评论 -
gcc和gdb
gcc -o main main.o 一步执行:gcc -o main main.c -g (1)一步执行:gcc -o main main.c add.c max.c。disable 断点号:将断点设定为无效的,不加断点号,将所有断点设置为无效。enable 断点号:将断点设定为有效的,不加断点号,将所有断点设置为有效;b 行号:给指定行添加断点 b 函数名:给指定函数的第一有效行添加一个断点。b.可以四步合为一步: gcc -o main main.c。info break:显示断点信息;原创 2024-03-25 13:51:22 · 1844 阅读 · 0 评论