Linux
文章平均质量分 80
南种北李
这个作者很懒,什么都没留下…
展开
-
Linux进程间通信
4.进程控制:有些进程希望控制其他进程 (如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它状态的改变。因为维护进程和文件之间的映射关系是进程找文件的,进程缺不了这个描述符表。内存级管道文件没有名字,父子进程看到同一个管道文件,是通过fork继承实现的,它俩是同一个文件描述符表,能看到同一个管道文件,fork之后,子进程继承父进程文件描述符表,struct file文件地址是一样的。管道文件只被写入,不被读取,管道文件缓冲区会被写满,写入端就会被阻塞。原创 2023-02-27 22:46:01 · 150 阅读 · 0 评论 -
Linux动静态库
如果我们不想给对方我们的源代码,给对方提供.o可重定位的二进制文件 ,让对方用对方的代码链接就行,未来可以提供.o(方法的实现)和.h(有什么方法)文件。动态库和静态库在链接时和可执行程序产生关联,静态库(.a)就是在编译链接时把需要的代码和数据拷贝到可执行程序,程序运行是不需要静态库。而动态库(.so)是程序运行时才去链接动态库的代码,多个程序共享使用库的代码,把需要的代码和数据地址拷贝到程序当中。gcc默认动态链接(建议选项),对于特定的库,究竟是动还是静取决与提供的是动态库还是静态库。原创 2023-01-15 08:39:26 · 141 阅读 · 0 评论 -
[Linux]文件
前三行是向stdout中打印,它缓冲区是行刷新,在fork之前,这三个c的函数已经讲数据打印到显示器(外设)上了,我们的FILE内部,及本进程内部不存在对应的数据了,如果我们进行了重定向,要写入的文件不再是显示器stdout,而是向文件中输入,缓冲区使用的刷新策略是全刷新,之前的3条c函数虽然带了\n,但不足以把stdout缓冲区存满,数据并没有被刷新。比如保存整个分区有多少个组,起始块号是多少,结束块号是多少等等,Super Block虽然在每个group中都有,但是它保存的是整个分区的信息。原创 2023-01-06 09:28:44 · 81 阅读 · 0 评论 -
用自己编写的简易shell实现文件重定向
先看下代码命令是要给子进程来执行的,真正重定向的工作也要子进程完成。如何重定向需要父进程给子进程传递信息。包括redienum,redirname。重定向由子进程执行,这里的重定向不影响父进程。因为进程的独立性。子进程是以父进程进行拷贝产生的,所以子进程的文件描述符表也是父进程复制的,它俩不是共用一个文件描述符表。而且如果共用一张表,子进程对文件描述符标的改动,父进程的文件描述符表会进行同样的改动,显然不符合进程的独立性。但是父子进程文件描述符表存的地址是同一个文件的,父子进程是由进程管理的,文件不受原创 2022-12-06 11:53:23 · 199 阅读 · 0 评论 -
[Linux]基础I/O
注意,改完后,原先的log.txt要rm删掉后,再运行一下这个代码文件,再vim打开log.txt。因为文件要的是字符串的有效内容,文件不以反斜杠0结尾,输入到文件中什么内容,文件就存什么内容。打开文件需要用户进程+操作系统,用户进程用来调用接口,操作系统实现文件的打开。一个文件没有被打开,不能直接对文件进行访问。操作系统要管理对应的打开文件,必定要为文件创建对应的内核数据结构标识文件。不是所有文件都被系统打开。文件读取有两种方式,一种是文本类,一种是二进制类。文件在磁盘里,磁盘是硬件,需要操作系统访问。原创 2022-11-26 18:43:21 · 284 阅读 · 0 评论 -
[Linux]自我编写shell(命令行解释器)
我们发现,中间多了一行,原因是我们在fgets输入时,输入里会车,再加上\n,就多出一行,解决方式如下。如果我们去掉./exec,那么我们是不是就可以自己写一个shell?获得命令行后,我们还需要对命令行字符串进行切割,以便实现对应的功能。代码实现就是这样的,我们直接输入命令就会执行对应的命令。在外面添加while(1)循环,来获得一下效果。定义DEBUG在Makefile文件中这样定义。下面就是我们自己写的一个shell例子的代码。用myshell替换mychild。那么这个进程替换从ls开始执行。原创 2022-11-21 17:03:49 · 895 阅读 · 0 评论 -
[Linux]操作系统提供的函数和C库函数的区别
操作系统提供的函数,我们称之为叫做系统调用函数,它是由操作系统内核,为我们提供的那个接口(函数),C库函数 ,指的是,有一帮开发C运行时库的大佬,他给我们程序员,将系统调用函数又封装了一层,然后提供出来一些较为简单的一些函数,然后这些函数,都是被放到C运行时库也就是c.so当中的,提供给程序员进行使用,所以这一部分函数,我们称之为C库函数吧。原创 2022-11-21 14:57:17 · 334 阅读 · 0 评论 -
Linux操作系统进程程序替换
程序归根结底都是代码和数据,所以当数据和代码被cpu调度时,这个程序就在运行,当我们实际调用exec时,实际是把可执行程序对应的代码和数据进行程序替换,把代码和数据从磁盘向物理内存中指定的位置加载的过程叫程序替换。而execl,execlp,execv,execvp并没有传环境变量的参数,它替换的程序却能调用默认的环境变量,它就是通过environ,通过地址空间的方式,让此程序拿到的。main函数也需要被传参,所以上述程序的main函数的参数列表,是exec*中的参数传进去的。参数的个数是可变的。原创 2022-11-20 22:34:59 · 400 阅读 · 0 评论 -
Linux操作系统环境变量
我们在使用ls命令时,其实是在创建子进程,ls也是个程序,而环境变量PWD可以被ls子进程继承下去,pwd环境变量被ls拿到,ls就知道当前在哪个路径下,所以显示文件时,我们不用带路径ls就知道文件在哪里。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。为了适应不同场景,要求操作系统启动bash,给我们做命令行解释,就必须预先设置好,未来我们要用到的变量,这批变量就叫环境变量。原创 2022-11-16 15:52:12 · 1753 阅读 · 1 评论 -
Linux操作系统进程控制
这里面创建完子进程后,子进程ret等于0,进入while(1)里面一直循环,而父进程因为ret大于0,所以继续执行外面的while(1)循环,并不执行内部的while(1)循环,此时父进程就会不断创建子进程,而且子进程还会一直while(1)循环,导致创建子进程失败。status有32个比特位,而我们只关心1~16位,9到16位保存进程对应的退出状态,即退出码,前7位保存进程终止的信号,一个进程如果出异常了,一定是收到了对应的信号,我们可以通过终止信号,得知这个进程是否异常。函数的实现在操作系统内部。原创 2022-11-16 16:13:43 · 584 阅读 · 0 评论 -
Linux操作系统程序地址空间
漂亮国有个大富翁有10亿美金,有三个私生子,(私生子彼此不知道对方存在),大儿子是工厂老板,二儿子是金融机构的CEO,三儿子在MIT读书,大富翁告诉大儿子,要好好工作,等到自己老了不行后将10亿美金都给他,大富翁又告诉二儿子,要经营好告诉,等自己老了不行时把10亿美金给他,大富翁又告诉小儿子,要好好读书,等自己老了不行时把10亿美金都给他。父进程开辟子进程后,子进程相当于父进程的拷贝,子进程在父进程的虚拟地址处开辟,即虚拟地址不变,此时父子进程的物理地址也是相同的,数据也相同,当子进程更改数据时,原创 2022-11-13 18:15:04 · 465 阅读 · 0 评论