- 博客(30)
- 收藏
- 关注
原创 LIUNX学习-线程
一个进程需要访的大部分资源,诸如自身的代码、数据、new\malloc的空间数据、命令行参数和环境变量、动态库、甚至是系统调用访问内核代码…都是通过虚拟地址空间来访问的。换而言之,进程地址空间是进程的资源窗口!! 进程创建费时费力。在创建时,我们需要为进程创建PCB、地址空间、页表、将进程自身的代码和数据换入内存并建立映射、将进程PCB状态改为R状态、添加带运行队列中… 但如果现在已经存在一个线程了,我仅仅将进程PCB复制多份,然后让所有“进程”PCB全部指向同一个虚拟地址空间。然后通过技术手段,
2025-03-05 23:21:26
692
原创 LIUNX学习-信号
机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号)。应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉。进程收到一个信号后,会检查对该信号的处理机制。如果是SIG_DFT,则会采用系统默认的处理动作,通常是终止进程或忽略该信号;如果给该信号指定了一个处理函数(捕捉),则会中断当前进程正在执行的任务,转而去执行该信号的处理函数,返回后再继续执行被中断的任务。自己处理信号的方法告诉内核,这样你的进程收到了这个信号就会采用你自己的的处理方式。
2025-03-04 00:01:31
347
原创 liunx学习—共享内存
操作系统将不同进程之间共享内存安排为同一段物理内存,进程可以将共享内存连接到它们自。己的地址空间中,如果某个进程修改了共享内存中的数据,其它的进程读到的数据也将会改变。ipcm -m 5 (删除ID为5的共享内存段,5可以换成其他数字))就是允许多个进程访问同一个内存空间,是在多个进程之间共享和传递数据最。共享内存创建之后,一直存在于内核中,直到被删除或系统关闭。共享内存和管道不一样,读取后,内容仍然在共享内存中。shm_read.c文件。
2025-02-17 23:49:17
172
原创 进程间的通信(消息队列)
消息队列可以实现消息的随机查询,消息不一定要先进先出的次序读取,也可以按消息的类型读取。消息队列独立于发送和接收进程,进程终止时,消息队列及其内容仍存在。消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。消息队列内部结构图(查看消息队列命令——ipcs q)绝对值的消息,如果有多个,则取类型值最小的消息。时用于以非先进先出次序读取消息,也可以把。返回队列中消息类型值小于或等于。返回队列中消息队列类型为。相对应的消息队列,并且。返回队列中的第一消息。
2025-02-16 12:21:04
427
原创 创建有名管道
参数:管道文件文件名,权限,创建的文件权限仍然和。数据存在内核中有一个对应的缓冲区。也是一个伪文件,在磁盘大小永久为。没有血缘关系的进程间通信。在磁盘上有这样一个文件。返回值:创建成功返回。
2025-02-15 18:26:35
115
原创 管道的概念
操作管理的进程被销毁之后,管道自动被释放。读端,写端,对应两个文件描述符。数据只能读取一次,不能重复读取。大小会根据实际情况做适当调整。数据写端流入,读端流出。
2024-10-23 10:49:42
243
原创 wait阻塞函数
函数作用:1.阻塞并等待子进程退出2.回收子进程残留资源3.获取子进程结束状态(退出原因)从运行结果可以看到,使用wait阻塞函数之后是先运行子进程在运行父进程的,打印了进程退出状态的参数说明进程是正常退出的。
2024-10-22 21:36:59
482
原创 vfrok创建进程
以下是vfrok函数创建进程的代码,子进程先对变量i进行自加操作,直到变量i大于或者等于3时才退出进程, 用exit(0)函数退出进程。可以看到使用vfork()函数之后,先执行的是子进程的代码,再执行父进程的代码。可以直接使用父进程存储空间,不拷贝。可以保证子进程先运行,当子进程调用。退出后,父进程才执行。
2024-10-21 10:42:17
236
原创 孤儿进程和僵尸进程
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。为了释放子进程的占用的系统资源:1.进程结束之后,能够释放用户区空间2.释放不了PCB,必须由父进程释放以下是一个孤儿进程的示例程序,在此程序中,让父进程先退出,然后子进程再次打印自己的父进程号,使用sleep函数保证父进程先退出。
2024-10-21 10:35:54
188
原创 exec函数族
* path : 要执行程序的路径(最好是绝对路径) 变参arg : 要执行的程序需要的参数 第一位arg: 占位 后边的arg: 命令的参数 参数写完之后:null 一般执行自己写的程序 *//* file :执行的命令名字 第一个arg:占位 后边的arg:命令的参数 参数写完之后:NULL 执行系统自带的程序:/bin/xx */ ps aux。这里以execl函数为例,在这里在原来代码的基础上,运行当前目录的hello代码文件,文件名是hello。3执行另外的程序,不需要创建额外的的地址空间。
2024-10-21 09:29:03
552
原创 父子进程的数据共享
1.一个进程,包括代码、数据和分配给进程的资源。2.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。3.一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。使用fork函数之后两个地址空间区数据完全相同各个进程的地址空间中的数据是完全独立的。
2024-10-21 09:13:49
505
原创 fork函数
()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进 程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。1.一个进程,包括代码、数据和分配给进程的资源。得到当前进程的父进程的。
2024-10-17 21:27:14
673
原创 进程和进程状态
多核的情况中,才会发生并行。否则,看似同时发生的事情,其实都是并发执行的。进程基本的状态有五种,分别为初始态,就绪态,运行态,挂起态和终止态。处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应。并发,指的是多个事情,在同一时间段内同时发生了。并行,指的是多个事情,在同一时间点上同时发生了。其中初始态为进程准备阶段,常常与就绪态结合来看。2.进程的状态,有就绪,运行,挂起,停止等状态。那么,就可以说听音乐和打游戏是并发的。并行的多个任务之间是不互相抢占资源的、并发的多个任务之间是互相抢占资源的。
2024-10-16 16:39:32
383
原创 静态库的创建
则指定了静态函数库名,由于静态函数库的命名方式是。依然可以运行,因为静态库的内容已经整合进去了。,在编译时就将库编译进可执行程序中。,表示静态函数库在本目录下查找。创建一个C语言文件,并写入如下代码。指定静态函数库的位置供查找,注意。: 如果从别处得到一个静态库。,想知道其中包含哪些模块。中不需要外部的函数库。2.缺点:可执行程序大。就会把静态函数库整合进。
2024-10-16 11:07:42
523
原创 行缓存的读写函数fgets函数和fputs函数
1.第一个参数:缓存,即读到哪里去2.第二个参数:读多少个字节3.第三个参数:从什么地方读4.返回值:若成功则为s(缓存的地址),若已处文件尾端或出错则为null。
2024-10-15 10:46:39
440
原创 fprintf和sprintf行缓存函数
字符串格式”)2.fprintf可以输出到文件中,也可输出到显示器,3.printf只能输出到显示器中。字符串格式”) 输出内容到一个字符串中注:fprintf,printf,sprintf都是行缓存函数,要用特定条件才能写到内核缓存里面。
2024-10-12 15:45:26
183
原创 fflush刷新缓冲和stderr无缓冲
但这里没有使用\n,也没有写满1024个字节,也没有使用系统函数和缓存函数,如图所示:这里使用fputs函数输出字符并配置为stdout(标准输出)使用stderr参数后,将用户缓存写入到内核缓存里,成功输出了字符数据。使用fflush刷新缓存函数,把用户缓存写入到系统缓存里。把库函数中的缓存内容强制写到内核中。使用fflush函数刷新缓存函数,成功输出字符数据。这里使用stderr(标准错误输出),即是无缓存参数。只要用户调这个函数,就会将其内容写到内核中。所有无法输出字符数据。
2024-10-12 14:56:08
571
原创 缓存的存在
标准IO:C语言的库函数(printf()),puts().gets()等之类。每打开一个文件,内核在内核空间中也会开辟一块缓存,这个叫内核空间的缓存。库缓存写满时,会调用系统调用函数,将库缓存内容写到内核缓存中。时,会将库缓存的内容写到内核缓存中,即调用了系统调用函数。我们的程序中的缓存,就是你想从内核读写的缓存(数组)中的写即是将用户空间中的缓存写到内核空间的缓存中。中的读即是将内核空间的缓存写到用户空间中的缓存中。1.使用标准IO,即使间接使用系统调用函数。的库函数中也有一个缓存,这个缓存称为。
2024-10-12 11:44:20
305
原创 fseek函数
把fp指针移动到离文件当前位置100字节处;把fp指针退回到离文件结尾100字节处。表示把fp指针移动到离文件开头1字节处,则在文件的开头的第一个位置开始写入数据(计算机里是从0开始的)。1.参数:第一个为文件指针,第二个是指针的偏移量,第三个是指针偏移起始位置。执行代码后就在e的位置继续写入数据(hell)若不懂fwrite函数可以看一下上一篇文章。
2024-10-10 21:25:58
1596
原创 main函数参数
2.argv存放了命令行中各字符串的首地址分别是./a.out ,src 和dec。1.argc表示命令行参数个数有3个,是 a.out ,src ,和dec。这里给大家讲清楚main函数参数(让大家理解一下原理)通过gcc +文件名(c语言文件)进行编译 如。可用./a.out执行编译后的文件。
2024-10-09 10:57:29
171
原创 read函数
并打印出来读出来的数据(两者代码都是差不多的,只是一个是写操作,一个是读操作)2.屏蔽单独写的操作,进行对文件单独读的操作。返回值:成功返回读取的字节数,出错返回。1.先对文件进行单独写的操作。之前已到达文件末尾,则这次。
2024-10-09 10:37:09
169
原创 write函数使用
先把hello world的字符串指针拷贝到writebuff数组里,完成open文件任务后,把writebuff里数据写入到mm文件里。会返回实际写入的字节数(当有错误发生时则返回。看看是否写入文件成功。
2024-10-09 10:26:02
304
原创 文件权限属性
2.权限指对文件的操作,linux根据文件将用户的身份分为 owner/group/other,而每个身份对文件的操作又分为 read/write/execute。打开此文件,如文件不存在就创建一个文件,并设置为可读可写模式,liunx系统中采用三位十进制表示权限,如0755,0644。1.属性指文件的信息,如大小、创建时间等。755 -> 用户:可读可写可执行。
2024-10-09 10:14:52
350
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人