![](https://img-blog.csdnimg.cn/194f2ff0ae1c4671adfbe69d3d633d78.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux学习
linux学习笔记
0-1背包
主要分享本人的C/C++、python、数据结构等学习笔记,希望跟大家一起学习,一起进步。在专栏中查看更加方便。
展开
-
11、信号量(三进程)
三个进程实现ABCABCABC…的有序打印:设置三个信号量:sem.h 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<sys/sem.h> 4 5 #define SEM_NUM 3 6 #define SEM1 0 7 #define SEM2 1 8 #define SEM3 2 9 10 union semun 11 { 12 int val; 1原创 2021-11-09 11:39:52 · 257 阅读 · 0 评论 -
10、信号量(两进程)
临界资源1、临界资源:同一时刻只允许一个进程来访问的资源。2、临界区:访问临界资源的代码段信号量信号量:为了控制对临界资源的访问。ex:0、1信号量,计数信号量、、、pv操作p操作:资源减一,代表获取资源。v操作:资源加一,代表释放资源。加一和减一都是原子操作。实例:假设有一个打印机,用A、B程序分别打印A和B,打印第一次时表示正在打印,第二次表示打印结束。与信号量相关的几个方法:1、sem_init() 初始化函数2、sem_p() p操作,使用资源,信号量-13、sem_v(原创 2021-11-09 11:08:04 · 872 阅读 · 2 评论 -
9、进程间通信:管道
进程间通信(ipc):管道 信号量 共享内存 消息队列 套接字1、管道管道如果为空,或者管道写满了,写会阻塞。重点:管道文件是在内存中分配空间,管道文件有一个读端,一个写端。管道分为:有名管道和无名管道。有名管道可以在任意两个进程之间通信,无名管道只能在父子进程之间使用;**通信方式:**半双工有名管道:1、mkffo FIFO2、系统调用管道文件 前面有个p prw-rw-r-- 1 stu stu 0 11月 1 19:20 fifo原创 2021-11-09 11:03:59 · 69 阅读 · 0 评论 -
8、制作bash
原理:读取指令,然后复制进程,再将要执行的命令/操作替换fork +替换 1 #include<stdio.h> 2 #include<sys/wait.h> 3 #include<stdlib.h> 4 #include<unistd.h> 5 #include<assert.h> 6 #include<string.h> 7 #include<pwd.h> 8 #include<e原创 2021-11-04 11:15:19 · 90 阅读 · 0 评论 -
7、替换进程
所有进程的创建都可以是:fork+execel,先将bash本身赋值,然后替换为要执行的程序。stu@stu-virtual-machine:~/Test/替换举例$ ps PID TTY TIME CMD 3386 pts/0 00:00:00 bash 10948 pts/0 00:00:00 psstu@stu-virtual-machine:~/Test/替换举例$ ps -fUID PID PPID C STIME T原创 2021-10-24 17:32:31 · 1849 阅读 · 0 评论 -
6、文件操作加系统调用
1、操作文件的系统调用系统调用和库函数的区别:系统调用的实现在内核中(就是在操作系统内实现的函数),库函数的实现在函数库中,属于用户空间。执行系统调用时会产生中断,中断(现场保护,现场恢复)。请求编号存在寄存器中,然后去内核中对照系统调用表,进行调用,将结果返回,存储在寄存器中,然后将值返回给系统调用值。1 代表命令 2代表系统调用 3代表库函数stu@stu-virtual-machine:~/Test/替换举例$ man openOPEN(2) Lin原创 2021-10-24 17:31:02 · 169 阅读 · 0 评论 -
5、僵死进程
1、僵死进程僵死进程:子进程先结束,父进程没有调用wait()来获取子进程退出码,那么子进程就会变成僵死进程,当僵死进程的父进程也运行完之后,会称为孤儿进程,此时会由INIT来将其回收,然后父子进程一同结束。 PID TTY TIME CMD 2791 pts/0 00:00:00 bash 3014 pts/0 00:00:00 僵死?程 3015 pts/0 00:00:00 僵死?程 <defunct> 3016 pts原创 2021-10-18 20:13:51 · 48 阅读 · 0 评论 -
4、fork()复制进程
1、fork复制进程进程:2、父进程子进程stu@stu-virtual-machine:~/Test/Forkex$ vi fork1.cstu@stu-virtual-machine:~/Test/Forkex$ gcc -o fork1 fork1.cstu@stu-virtual-machine:~/Test/Forkex$ ./fork1s=parent,ppid=4067,pid=4390s=child,ppid=4390,pid=4391s=parent,ppid=4067原创 2021-10-17 13:18:26 · 96 阅读 · 0 评论 -
5、main函数参数
1、argc 参数个数 argv参数名称 1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(int argc,char*argv[],char*envp[])//参数个数,参数内容,环境变 量 4 { 5 printf("argc=%d\n",argc); 6 for(int i=0;i<argc;i++) 7 { 8 printf("argv[原创 2021-10-16 23:36:48 · 105 阅读 · 0 评论 -
3、库文件
1、什么式库文件:库文件是预先编译好的方法的集合。(相当于一大堆的可执行文件) 存放头文件的标准目录:/usr/include存放库文件的标准目录:/usr/lib比如:printf函数的实现在库文件中 libcs.so声明在/usr/include/stdio.h库分为:静态库 libxx.a共享库 libxx.so2、创建静态库stu@stu-virtual-machine:~/Test$ cd 静态库举例stu@stu-virtual-machine:~/Test/静态原创 2021-10-16 23:00:58 · 496 阅读 · 0 评论 -
2、gdb调试
再vs中有Debug和Release版本生成解决方案,Debug生成的exe文件比Release生成的exe文件大,原因是Debug版本的带有调试信息可以对程序进行调试,而Release原则上不能进行调试。1、gdb中常用命令调试对象:Windows:exeLinux: main调试程序是对可执行文件进行调试。编译时需要增加调试信息 -g //ex gcc -o main Test.c -gl 显示代码b + 行号 设置断点info break 查看断点信息r 启动程序原创 2021-10-16 13:22:40 · 181 阅读 · 0 评论 -
1、makefile库文件
当文件很多时需要用工程来进行管理,这时就需要用到makefile1、安装makesudo apt install make安装成功:stu@stu-virtual-machine:~$ makemake: *** 没有指明目标并且找不到 makefile。 停止。2、进入makefile文件vi makefile目标文件:依赖文件规则 1 all:main 2 3 main:main.o add.o max.o 4 gcc -o main main.o ad原创 2021-10-10 22:09:16 · 106 阅读 · 0 评论