![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux模块学习
文章平均质量分 72
不会学习的小白O^O
这个作者很懒,什么都没留下…
展开
-
TCP服务器的编写(下)
当然是不需要的,你本身是一个客户端,其他人写的应用也可能是客户端,如果我们bind,一定意味着我们当前客户端进程绑定的一定是一个非常具体的端口号,一旦绑定的是一个具体的端口号,换而言之,A客户端,B客户端,是由不同的软件公司提供的,那么这里绑定的端口号,有可能在不经过商量的情况下,冲突,那么就势必会有某一个客户端启动不起来!不需要,多进程当中每个进程都有文件描述符表,但是在多线程这里每一个线程,和我们的主线程是会共享文件描述符表的!我们的客户端,创建完套接字,需不需要bind呢?原创 2023-12-31 01:50:39 · 674 阅读 · 0 评论 -
实现一个简单的网络通信上
如果我们当前已经创建好了一个套接字,那么我们有了一个文件描述符,那么就给未来通信提供了一种能力,能够通过文件描述符进行IO,但是套接字通信是两台跨网络的主机,上面的应用进程在进行通信,那么套接字通信时,需要用ip和port标识该服务器上唯一的进程。我们写的是基于udp协议的服务器,如果你想进行网络编程,那么创建的第一个就是socket 创建套接字。现在我们的客户端和服务器就可以建立连接了,接下来我们写点更好玩的。那么我们的服务器有了,接下来就是初始化服务器。至此我们的简单的完成了我们的客户端和服务器。原创 2023-12-01 23:28:55 · 378 阅读 · 0 评论 -
网络编程套接字
那么现在问题来了,我们有了IP地址,能够通过IP地址将数据交付到对方主机上,交给了对应的主机之后,怎么保证对方主机可以把数据交付给特定的进程呢?套接字种类的不同,理论上是三种应用场景,对应的应该是三套接口!---》但是不想设计过多的接口!---》将所有的接口统一,用的都是同一套函数。你在玩抖音,你得把抖音打开了,才能给你推视频,客户端软件必须运行的状态,才能给你推视频。2.原始socket(跳过传输层的接口,可以直接调用网络层接口甚至是数据链路层的接口)1.域间socket(本主机间的通信)原创 2023-11-13 23:44:45 · 193 阅读 · 0 评论 -
网络基础(1)
如果当B和D在进行通信时,A也向这个局域网发送光电信号,A是个捣蛋分子,B刚给D发送了一个信号,局域网是共享的,A不断的向这个局域网当中发送信号,那么这时候就会将A发出的信号和B发出的信号揉在一起,那D都无法识别B的信息了-------------A主机想把数据发给B主机,拿到B主机的MAX地址没有任何用,毕竟A没有办法直接向B主机直接通信,所以A主机要向B主机发起通信,只能拿到B主机的IP地址(A主机有的是方法拿到B主机的IP地址) , 那么A主机只能用B主机的IP地址给B主机发信息了。原创 2023-11-09 23:35:44 · 190 阅读 · 0 评论 -
linux(线程池)
这道理就好比,你每次去找你妈要钱,你找她一次你得跑一次,然后呢你还得找她要一块钱,你妈妈呢还得盘算一下家里的钱够不够,够了给你一块钱,过一会你又想要一块钱,那么你又得跑过去找你妈,那么你妈又要盘算一下家里的钱够不够,后来呢,你觉得来来回回太麻烦了,你今天想要100块钱,你跑过去找你妈要,在未来的1个月你都不在找你妈要钱,你妈盘算之后,给了你100块钱,那100块钱就在你的口袋里,花多少,怎么用由你自己决定。线程不知道,程序员知道。我们这样就维护了写者和写者之间的互斥,和写者和读者之间的互斥!原创 2023-07-03 11:28:25 · 100 阅读 · 0 评论 -
linux(信号量)
每个人想进放映厅看电影,第一件事就是买票, 所以我们要知道每个线程想访问临界资源,第一件事就是都得申请信号量资源。其中对我们来说呢,信号量必须为我们提供一个P操作 V操作。生产者:最关心什么资源呢?环形队列当中,空的位置。如果我们想改成多生产多消费者模型,改怎么改呢?消费者:最关心什么资源呢?空的位置和数据我们统称为资源!我们该如何创建信号量呢?那么P操作是什么呢?原创 2023-06-30 16:14:40 · 220 阅读 · 0 评论 -
linux(线程互斥与同步下)
之前我们我们进程讲的进程间通信,不管是管道还是共享内存,进程间通信的本质都是让不同的进程看到同一份资源,但今天,我们可以已同样的视角去看待我们的生产者和消费者模型,我们之前讲进程间通信就是生产者消费者模型,所以管道内部自带同步和互斥机制,而其中管道文件和共享内存就是交易场所。此时我们生产者不断的在生产任务,我们的消费者在不断的处理任务,所以呢此时我们就相当于一个在不断进行生产,一个在不断把任务拿出来,在做处理,所以此时我们就出现了消费者在做任务处理时,生产者在派发任务,就实现了并行运行。原创 2023-06-25 15:42:01 · 118 阅读 · 0 评论 -
linux(线程同步和互斥)
实现互斥锁,大多数体系结构都提供了swap和exchange指令,该指令的作用是把寄存器和内存单元的数据相交换,由于一条指令,保证原子性,即使是多处理器平台,访问内存的,总线周期也有先后,一个处理器上的交换指令执行时另一个处理器的交换指令只能等待总线周期。提供了swap和exchange指令的目的是:用一条汇编,完成内存和CPU内寄存器数据的交换!现在tickets就是临界资源,这个临界资源不是安全的,为什么不是安全的呢?mutex的本质其实是通过一条汇编,将锁数据交换到自己的上下文中!原创 2023-06-20 00:01:36 · 308 阅读 · 0 评论 -
linux(线程控制)
但是要是我们线程是异常退出的呢?,我们线程出现崩溃的情况,我主线程也别管了,你也管不了,你也是跟着崩溃了,那么你pthread_join没有意义了。一般而言,线程也是需要被等待的,如果不等待,可能会导致类似于”僵尸进程“的问题!exit是终止进程的,不要在其它线程中调用,如果你就像终止一个线程的话!线程健壮性的有问题的,一个线程出现了崩溃的问题,那么整个进程也就会跟着崩溃。如果以后看到一个线程的退出时的返回值是-1,证明这个线程是被取消的!主线程不退出,新线程处理完业务,处理完毕在退出!原创 2023-06-16 01:52:07 · 169 阅读 · 0 评论 -
linux(线程概念)
如果我假设,我有一个能力把你的代码分上一部分,把你的数据分上一部分,把你乱七八糟的区域分上一小部分,然后我创建一个PCB,,不过我新的PCB不想创建新的进程,新的PCB不想指向新的地址空间,而是指向我们主进程的PCB地址空间同一个。这样的每一个一个一个的PCB 在我们的linux当中称之为线程。线程:是在进程内部运行的一个执行分支(执行流),属于进程的一部分,粒度要比进程更加细和轻量化。CPU调度进程,拿着你进程PCB,把你PCB当中的上下文,放进CPU当中,恢复进程。上面叫做线程是属于进程的一部分呢?原创 2023-06-13 23:17:47 · 441 阅读 · 0 评论 -
linux(信号结尾)
一般这个flag是全局变量,是变量,在进程运行时就应该在内存开辟空间,换句话说,CPU要识别flag就必须从内存里读flag,读到CPU内,在CPU内做判断,判断完之后,在继续从内存拿flag读到CPU内做判断,不断循环的过程,这样不断的检测flag的值。但是我们收到信号,执行信号捕捉的时候,它内部修改了flag,但是它内存修改的flag并不是CPU上的flag,而是内存当中flag,我main函数的执行流又不从内存当中读你的flag了,而是直接用CPU当中寄存器存的那个flag。怎么去解决这个问题呢?原创 2023-06-10 15:06:40 · 751 阅读 · 0 评论 -
linux(信号发送后)
用户态调用系统调用进入内核态,把系统调用的内核代码执行完,准备返回用户态的时候,我不着急返回,反正我刚好也在内核,PCB也在内核当中,顺便对进程 的信号检测一下,有信号没有被block,直接执行它的方法,执行完必之后回到内核(默认和忽略是直接内核态执行就可以了,只要自定义捕捉的时候,需要我们切换回用户态)!所以在我们的CPU当中有一个寄存器(CR3),为0的时候代表操作系统,为3的时候代表普通用户(所以说当我们进程在执行的时候,怎么知道自己是内核态还是用户态,就是完完全全查CPU的寄存器(CR3))原创 2023-06-08 18:16:33 · 517 阅读 · 0 评论 -
linux(信号产生中)代码来验证
如果我的进程预先屏蔽掉2号信号,然后我不断的获取当前进程的pending位图,并打印显示(刚开始没有发送2号信号的时候打印的一定全是 00000000000000000000...)然后我手动发送2号信号,因为2号信号不会被递达,所以,当我不断在进行打印的时,能明显感受到有一个比特位设为1了,同时因为改信号不能被递达,所以永远只能被保留在pending位图里。我们可以对2号信号进行捕捉,自定义我们对2号信号的执行动作,就可以看到我们想看到的现象!接下来我们怎么去设置与进程信号相关的内容呢?原创 2023-06-07 14:09:15 · 134 阅读 · 0 评论 -
linux(信号产生中)理论部分
我们可以具体来看看我们的 SIG_DFL | SIG_IGN是个什么东西呢?我该怎么理解 递达、阻塞、未决这些概念呢?原创 2023-06-06 01:36:59 · 290 阅读 · 0 评论 -
linux(信号产生的各种方式)
如何理解OS给进程发送进程信号 --》 发送信号数据给 task_struct --》 本质是OS向指定进程的task_struct 中的信号位图写入比特位1,即完成信号的发送 --》信号的写入。所以呢,相当于我的进程出现崩溃的情况,我们可以尝试着把我们的core dump这个选项打开,直接看崩溃的位置。当一个进程正常退出时,status次低八位,代表的是进程退出时的退出码,后低7位表示的是进程收到的信号。可是我该证明验证我有没有core dump文件是由 core这个标志位决定的呢?原创 2023-06-05 23:39:26 · 331 阅读 · 0 评论 -
linux(信号)背景知识
结论3 :进程收到信号之后,需要先将信号保存起来,以供在合适的时候处理!第一个结论:进程具有识别信号并处理信号的能力,远远早于信号的产生的!第二个结论:进程收到某种信号的时候,并不是立即处理的,而是在合适的时候。结论4:信号的本质也是数据。原创 2023-06-02 16:57:58 · 38 阅读 · 0 评论 -
linux(system V标准)信号量
我们看一个问题,我们fork()之后创建一个子进程,那么我们的全局变量,是不是我们父子进程的临界资源呢?在任意一个时刻,只能允许一个执行流进入临界资源,执行它的临界区。当然不是了,我们的子进程会写实拷贝,自己复制一份父进程资源。凡是倍多个执行流同时访问的资源就是临界资源!我们现在再来解释一个概念!原创 2023-06-02 01:29:38 · 313 阅读 · 0 评论 -
linux(system V标准)进程间通信2
我们刚刚是一个进程和共享内存关联,我们现在两个进程和我们的共享内存关联呢?数据结构的第一个结构类型的完全一样的!我们在shmget创建共享内存的时候。我们发现了共享内存、消息队列、信号量的接口都是类似的。我们先看看操作系统用户层给我们暴露出来的数据结构。在内核当中,所有的IPC资源都是通过,数组组织的。我们来看看信号量的用户层数据结构和一些调用接口。这样子我们两个进程都挂接上了我们的共享内存。我们也来认识一下消息队列的接口。可是怎么通过数组组织的呢?接下来我们来写一点测试的代码。原创 2023-06-01 12:24:31 · 460 阅读 · 0 评论 -
linux(SystemV标准)进程间通信1
我们之前来看,有一个小问题就是,想让进程间通信的前提就是让不同进程看到同一份资源,而同一份资源都是由操作系统提供的,操作系统能用现成的资源比如文件,就用文件。两进程之间数据结构互相独立,物理内存当中代码和数据又互相独立,所以两个进程不会互相干扰,这叫做进程具有独立性。只要我们的形成key的算法+原始数据是一样的,形成同一个ID!我们之前学的什么匿名管道、命名管道通信都是基于文件的通信方式!第二步 通过某种调用,让进程“挂接”到这份新开辟的内存空间上!所以你怎么保证不同的进程看到的是同一个共享内存呢?原创 2023-05-31 02:13:32 · 501 阅读 · 0 评论 -
进程间通信(命名管道)
因为命名管道,也是基于字节流的,所以实际上,信息传递的时候,是需要双方定制“协议的”,不考虑这个。为什么我们之前的pipe叫做匿名管道,为什么现在的fifo叫做命名管道呢?一旦我们具有了一个命名管道,此时我们只需要让通信双方按照文件操作即可!原因是因为fifo命名管道有名字,名字叫fifo,为什么一定要有名字呢?接下来,我们在运行我们的client程序,打开管道文件,进行写入。因为匿名管道没有名字,为什么匿名管道可以没有名字呢?自此,我们的管道文件就有了,进程怎么通信呢?我们现在开始证明他们两个能通信!原创 2023-05-29 16:14:44 · 587 阅读 · 0 评论 -
Linux(进程间通信)
看到了,就是一份文件,如果父进程写入自己的数据进对应的缓冲区当中不触发你的磁盘驱动的写入函数刷新到磁盘上,那么是不是另一个进程通过文件描述符找到同一个struct_file然后找到这个缓冲区的数据,是不是可以做到将一个进程的数据交给了下一个进程,这就是叫做让不同的进程看到了同一份资源,这种基于文件的通信方式,就是管道(一个进程往缓冲区里写数据,下一个进程往缓冲区里读数据)接下来我们代码实现管道通信 -------------------------那么我们就当写满的时候,再来读看看,通过一段代码来看看。原创 2023-05-28 02:12:18 · 1059 阅读 · 0 评论 -
linux(动静态库)
库的存在一方面是方便使用还有一方面是私密(我不想把我的源文件给它,只想把库给他),将来给别人让别人用的时候,给的就是一套头文件和库文件,通过库把我们的源文件进行了封装保护。我们在C语言上代码时,除了自己写的循环,判断这些自己的代码,还会调用C语言的printf、scanf这些C语言的库,这些库函数实际在你编译时,通过链接库的方式。动态库和静态库相比,静态库本质上是把库当中的程序相关的内容直接拷贝进目标代码的,静态库是把我们所依赖的代码拷贝进你的可执行程序里。.h当中只有声明,没有实现,是方便我们制作库的。原创 2023-05-25 13:56:29 · 474 阅读 · 0 评论 -
linux(软硬链接)
当硬链接文件时,又增加了一个文件名和inode映射关系,有两个文件名和inode建立映射关系。删除链接我们用unlink 也可以用rm 但是更建议用unlink。创建硬链接,本质是在特定的目录下,填写一对文件名和inode映射关系!当我们创建文件的时候,默认只有一个文件名指向我们新创建的文件inode。我们软硬链接都创建出来了,那么软硬链接有什么区别呢?我们可以思考一下创建硬链接本质上做了什么呢?软链接特别像我们windows下的快捷方式!我们在什么时候会用这个软链接呢?我们现在说说硬链接有什么用。原创 2023-05-22 23:14:51 · 1486 阅读 · 0 评论 -
linux(inode)学习
于是我们要理解磁盘,我们就将磁盘的圆状结构转换成了 线性结构,我要理解线性结构,就知道线性结构有一个下标地址(下标地址LBA在磁盘上地址的转换),然后对磁盘的读写,变成了对大空间的读写,对大空间的管理成本太高,把大空间拆成小空间,小空间管理好,大空间也就能管理好!我们在创建一个文件的时候,在inode Table 申请一个inode就能申请到吗?我在操作linux的时候,我们也是在一个目录下的,可我怎么确保我是在哪个分区里的block块中的呢?如果一个文件没有被打开,这个文件在哪里呢?原创 2023-05-21 01:30:12 · 520 阅读 · 0 评论 -
linux(缓冲区学习)
每一个进程都有一个指针*files ,指向一张files_struct ,该表最重要的部分就是包含一个指针数组,每一个元素都指向打开的文件指针!这很好理解,因为你重定向叫做输出重定向,,所谓的输出重定向把原本应该写入到1号文件描述符的内容,直接显示到我指定的文件中,而2号没变,2号照样指向标准错误。而现在知道了,文件描述符是从0开始小整数,当我们把文件打开时,操作系统在内存中要创建对应的数据结构来描述目标文件。现在我们也可以解释前面的全部问题了!我如果把1关了呢?我们现在再来分析我们的代码。原创 2023-05-19 01:22:44 · 314 阅读 · 0 评论 -
linux(基础IO)下
当我fork()创建的时候,也要形成新的task_struct,也要有自己独立的files_struct,子进程的pcb是以父进程为模板拷贝的,files_strcut也要拷贝过来,是两份完全一样的内容。原因是因为我们命令行上所起的所有进程的父进程都是bash,bash是命令行进程啊,命令行当然要打开标准输入,标准输出,标准错误啊,子进程默认也就继承下去了。那么按照上面的说法,我要实现输出重定向是不是得每次把1关掉,然后在打开文件这样的去重定向吗?上面是输出重定向的原理,那追加重定向呢?原创 2023-05-17 23:43:03 · 276 阅读 · 0 评论 -
linux基础(IO)中
所以我们刚刚的printf 是往stdout里写,stdout里面封装了一个fd,它的fd是1,所以它只关心1这个数字,而实际上呢,我们printf在进行写入时,我已经把1原来指向的显示器文件,指向了log.txt文件,而1这个下标的没变的,而printf照样只认识1,所以它向1打印了,本来应该打印到显示器时,结果打印到了log.txt当中 ------------- 这也就是重定向的原理。标准输入呢---换句话说我们是不是可以通过我们的read从我们的显示器上读数据呢?-------输出重定向。原创 2023-05-17 12:07:09 · 256 阅读 · 0 评论 -
linux基础(IO)
因为flag这边是整数,我们之前写过很多C语言的代码需要传递标志位,我们定义flag,用1表示为真为假这样的一个概念,但是呢,这个标志我们只能传一个整数,把一个整数对应一个具体的含义,但是操作系统呢?在传递标志位的时候,int是有32个比特位的,所有呢?实际上我们是传标志位,我们是不是可以以一个bit代表一个标志,我一次就可以通过位操作的方式,向我们的系统传递多个标志位。我们发现文件描述符3 4 5 6 ,这些文件描述符是连续的,可是小于0是出错的,为什么不从0开始打印呢?原创 2023-05-15 15:45:25 · 460 阅读 · 0 评论 -
进程控制下(程序替换部分)
我们只要把蓝色框中的内容动都不动,可能需要把页表的部分映射关系改变一下,我们只要把新进程B的代码和数据替换A进程的物理内存当中,那么这样子我们A进程在执行代码和数据的时候,将不在执行老的代码和数据,而是执行新的代码和数据了。既然我们的程序替换能把系统的程序运行起来,那么能不能把我自己的程序运行起来呢?蓝色框内执行的是A进程的代码和数据,如果突然要执行B进程的代码和数据呢?我们替换了子进程进行了程序替换可是我们的父进程为什么没有受影响呢?可是问题来了父子代码不是共享的嘛?我们如果创建出子进程呢?原创 2023-05-12 02:53:48 · 301 阅读 · 0 评论 -
进程控制(中)
非阻塞等待呢就意味着,调一个waitpid()接口,调完之后立马返回,CPU可以正常去调度父进程,父进程不断的去执行waitpid()的过程就是非阻塞。这里补充一下,阻塞等待是不挂电话的,我让张三别给我挂电话,当你要下来了了再挂电话。阻塞的本质: 其实是进程的PCB被放入了等待队列,并将进程的状态改为S状态。返回的本质: 进程的PCB从等待队列拿到R队列,从而被CPU调度。我们如何理解阻塞等待和非阻塞等待呢?那么我们该如何进行非阻塞等待呢?那么我们的代码异常终止是什么情况呢?代表着代码跑完了,结果不正确。原创 2023-05-10 01:11:54 · 605 阅读 · 0 评论 -
进程控制(上)
所以我获得的status是由32个比特位构成的,我们的次低8位对应着我们进程退出时的退出码,那么我们的第七位代表着我们的进程收到的信号,那么只要将来我们收到的退出码时,第七位是0,代表着没有收到信号,这个进程是正常运行完的,运行完了对还是不对,通过次低8位获得。3.进程退出(尤其是子进程)退出的时候,会先进入僵尸状态,会造成内存泄漏的问题,需要通过父进程wait,释放该子进程占用的资源!(不然我父进程比你子进程先退出,那我父进程还怎么获取你子进程的退出信息啊!这个值是进程的退出码!原创 2023-05-09 00:23:13 · 363 阅读 · 0 评论 -
程序地址空间(下)
CPU将程序的代码和数据加载到物理内存当中,将物理内存的地址保存在这个进程对应的页表物理地址当中,而CPU设定了只从0x1234开始读,那么我们将虚拟地址0x1234和我们的刚刚保存的将代码和数据加载到内存当中的物理地址进行映射。小时候你的同桌是一位爱干净的女孩子,然而你是一位非常不爱干净的男孩子,老是流口水什么的,所以你的同桌小女孩非常的反感你,决定和你划分界限。操作系统这时候在去物理内存上给你申请一部分空间,接下来把你在进程地址上的虚拟地址和物理内存上的地址在页表建立映射关系。原创 2023-04-22 21:49:07 · 434 阅读 · 0 评论 -
程序地址空间(上)
有一个大富翁(银行存有100亿),不过大富翁有3个私生子(私生子就是私下生下来的,彼此之间都互相不认识),每一个私生子都知道他有一个爹是大富翁,所以大富翁对他的3个私生子分别说了,当老爹去世了,就由你来继承老爹的100亿,那么大富翁的每一个私生子都认为自己是100亿的唯一继承者。这样子有一个好处,简化私生子处理钱的方式(让私生子认为自己有10个亿,这样子的话他们能以统一的方式(自己有100亿的方式)规划自己的花钱方式)每一个进程都有一个地址空间,都认为自己独占物理内存!地址怎么能没有变化呢?原创 2023-04-20 04:10:11 · 304 阅读 · 0 评论 -
环境变量的初始
换言之 : 系统会存在大量 的一组属性变量,来维护系统当前所处的运行相关状态信息,这些就叫做环境变量,每一种环境变量有一种职责,有的是帮你查命令,有的是帮你确认你当前的路径 的、有的是确认你当前 的主机名的……可是我们刚刚一直在谈的可以通过命令行参数、env、getenv这些函数来获得环境变量,可是这些子进程的环境变量是谁给的呢?./ 本质是帮系统确认对应的程序在哪里 -------》 为何系统的命令不用带路径呢?环境变量本质是OS在内存/磁盘文件中开辟的空间,用来保存系统相关的数据!原创 2023-04-18 13:22:27 · 410 阅读 · 0 评论 -
进程优先级
我们调正进程的优先级本质就是调整nice的值(nice值的取值范围 -20 - 19)优先级在怎么设置,也只能是一种相对的优先级,不能出现绝对的优先级,否则会出现很严重的进程”饥饿问题“并发 : 多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程得以推进,称之为并发。NI : 代表这个进程的nice值(进程优先级的修正数值)竞争性 : CPU的资源毕竟是少量的 ,进程之间是具有竞争性的。nice值为何要是一个相对比较小的范围呢?为什么会有优先级?原创 2023-04-17 01:38:17 · 478 阅读 · 0 评论 -
进程状态初始
那么当磁盘可以读的时候,磁盘一旦可以读,要做的不是将等待队列的进程去读磁盘,而是将这个进程的状态设为R状态(换而言之就是这个进程等待成功了),将这个等待成功的进程挪到CPU的运行队列上。这个时候,当我们的子进程都退出的时候,父进程一旦终止,虽然我们的父进程没有回收子进程,我们的操作系统也会想办法回收这个子进程的。进程状态的意义:方便OS快速判断进程,完成特定的功能,比如调度,本质就是对众多状态的分类!上面的是子进程退出,父进程仍在运行的情况(子进程先于父进程死亡)向进程发送信号的方式来开始和暂停一个进程。原创 2023-04-09 19:24:50 · 123 阅读 · 0 评论 -
系统调用创建进程 — fork初始
那么我们子进程和父进程的代码是共享的,怎么才能让子进程和父进程执行不同的代码呢?------》这就需要用到我们的fork的返回值了。我们创建的子进程,就是为了和父亲干一样的事情?有意义嘛------->一般是没有意义的!那么我们的21144这个PPID的进程是谁呢?---》这个是我们的命令行(也就是bash)那么我们可以知道这一定是两个进程来执行的,不然怎么可能执行两次。一般还是要让我们的子进程和父进程做不一样的事情(才能提高效率)到这里我们就可以观察出fork创建了子进程!如何理解有两个返回值?原创 2023-04-07 02:00:48 · 161 阅读 · 0 评论 -
进程概念初始1
既然我们的CPU在快速切换我们的进程,甚至进程在运行期间,存在大量的临时数据!-------> 这些数据暂时存储在CPU 的寄存器当中保存。ps axj | head -1 && ps axj | grep "关键字"方法2 : kill -9 跟进程pid(也证明了pid唯一性)所以课本上的概念是不清晰的,那么进程真正的含义是什么呢?想真正理解进程的含义,就需要先知道操作系统是如何管理进程的。当进程退出时,也就没这个目录文件了(自动销毁)ppid(父进程id)如何拿到进程的退出码。原创 2023-04-05 18:01:23 · 259 阅读 · 0 评论 -
操作系统初始
可是管理者和被管理者并不直接打交道 ----你的数据又是怎么被校长知道的呢?概念: 计算机系统都包含一个基本的程序集合,称为操作系统(OS)可是管理者和被管理者并不直接打交道---决策的执行,是辅导员。那么问题来了操作系统是如何为程序员提供各种基本功能的呢?对程序员 --- 操作系统要为程序员提供各种基本功能。内核 (进程管理、内存管理、文件管理、驱动管理)操作系统要为用户提供良好的运行环境 -- 普通用户。OS是怎么办做到对下,和对上的管理的呢?、键盘,网卡、显卡、话筒、摄像头)原创 2023-04-03 13:18:09 · 41 阅读 · 0 评论 -
linux的第一个小程序 -- 进度条
如果我们既不想带\n ,但是又想将数据即使的刷新到我们的显示器上我们使用 ( fflush函数)我们再来看printf("hello cdc")不带\n的现象。从上面的现象观察来看 (是不是由于\n 引起的呢?printrf(”hello cdc\n“)的现象。我们先看一种现象(我们之前可能从来没有注意到的)所以我们把显示器、键盘这样的设备称为字符设备。那么我们现在就可以开始写我们的进度条功能了。按上面的思路(也就实现了我们的倒计时了)我们先写一个倒计时的功能来玩。原创 2023-04-02 14:19:26 · 48 阅读 · 0 评论