自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 linux——线程设置分离属性

PTHREAD_CREATE_JOINABLE(非分离)PTHREAD_CREATE_DETACHED(分离)这段代码就是创建一个分离线程,主线程不用等它,他自己跑完自动回收资源,不需要pthread_join。也可以用pthred_detach(pthid),就属于创建后将普通线程修改为分离线程,效果是一样的。参数: attr : 线程属性。1.线程属性类型: pthread_attr_t attr;对线程属性变量的初始化。两种方法都可以,完全等价。通过属性设置线程的分离。

2026-04-06 21:20:29 25

原创 linux——线程相关函数

3、比较两个线程ID是否相等(预留函数) --pthread_equal。2、杀死(取消)线程--pthread_cancel。1、线程分离--pthread_detach。

2026-04-06 20:46:56 17

原创 linux——回收子线程

这是因为在用pthread‐exit(void *retval)里面的指针必须指向全局,或者堆区的才可以,而我们赋值的int num=100在子线程,所以打印不出来。这里面打印的num是一个随机值,但是我们给num赋值100了呀,为什么回收完还要打印随机值呢。阻塞等待线程退出,获取线程退出状态--pthread_join。这样就可以打印出来了。

2026-04-06 17:13:39 113

原创 linux——退出单一线程

exit(0)

2026-04-06 16:53:02 152

原创 linux——创建线程及打印错误信息

strerror就是用来讲错误代码的表示的信息显示出来。为什么子线程不打印?

2026-04-06 00:48:26 137

原创 linux——线程的概念

线程是进程内部的最小执行单元一个进程里可以创建多个线程共享进程的内存、文件描述符、全局变量、资源各自独立跑自己的代码流开进程 = 重新盖一栋楼开线程 = 楼里多雇一个员工干活进程是资源分配单位,线程是调度执行单位多进程隔离安全,多线程共享高效线程共享堆、全局区;独有栈、局部变量。

2026-04-05 22:09:43 327

原创 linux——守护进程

把一组有关联的进程打包成一个团队,方便统一管理(发信号、结束、调度)。比如:一条管道命令,两个进程默认在同一个进程组。进程组 = 一个班级组长 = 班长全班 ID = 班长学号老师发指令(信号)→ 全班都收到会话是最高层级,绑定一个控制终端(你打开的黑框终端)。:你登录终端→创建一个会话→所有执行的程序都挂在这个会话里。会话 = 整个年级终端 = 年级教室关教室(关终端)→ 年级里所有学生(进程)全赶走守护进程 = 转学出去,脱离教室,不关不停Linux 后台永久运行的服务进程。

2026-04-05 21:44:03 422

原创 linux——PV操作

共用体:所有成员共用一块内存,这里只存一个 int 值。专门用来装「信号量初始计数器数值」Linux 规定:用。

2026-04-05 20:36:22 180

原创 linux——信号灯

信号灯集合(可以包含多个信号灯)IPC对象是一个信号的集合(多个信号量)

2026-04-04 23:35:02 216

原创 linux——信号

信号通信,其实就是内核向用户空间进程发送信号,只有内核才能发信号,用户空间进程不能发送信号。内核可以发送多少种信号呢,使用命令kill -l,就可以查看我们之前终止进程用的就是第9个信号通信的框架信号的发送(发送信号进程):kill、raise、alarm信号的接收(接收信号进程) : pause()、 sleep、 while(1)信号的处理(接收信号进程) :signal。

2026-04-04 21:58:30 601

原创 linux——共享内存

操作系统将不同进程之间共享内存安排为同一段物理内存,进程可以将共享内存连接到它们自己的地址空间中,如果某个进程修改了共享内存中的数据,其它的进程读到的数据也将会改变。注意,我在写端延迟了3秒再删除地址映射,也就是说,写端输入完之后,3秒之内要在另一个终端执行读端,否则将什么也读不到。管道和消息队列都是一次性读取的,读一次之后内容就被删除了,而共享内存不一样,不论都多少次,那条消息都在。atoi是将输入的字符串转成数字,因为shmid是整型,而输入的是字符串。

2026-04-03 23:27:33 411

原创 linux——消息队列进程间通信

ftok函数。

2026-04-03 00:06:13 418

原创 linux——消息队列发送和读取函数

【代码】linux——消息队列发送和读取函数。

2026-04-02 21:17:12 13

原创 linux——消息队列

消息队列可以实现消息的随机查询,消息不一定要先进先出的次序读取,也可以按消息的类型读取。消息队列,是消息的链表,存放在内核中,一个消息队列由一个标识符(队列ID)来标识。消息队列独立于发送和接收进程,进程终止时,消息队列及其内容仍存在。消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。这段代码是先创建,然后又删除了。这样就指定删除了id为0的队列。每执行一次,就会多创建一个。

2026-04-01 23:01:31 180

原创 linux——有名管道

参数:管道文件文件名,权限,创建的文件权限仍然和umask有关系。返回值:创建成功返回0,创建失败返回-1。在磁盘上有这样一个文件 ls -l ->p。4.fifo文件可以使用io函数进程操作。也是一个伪文件,在磁盘大小永久为0。数据存在内核中有一个对应的缓冲区。命令:mkfifo 管道名。没有血缘关系的进程间通信。不能执行lseek操作。两种方法都创建成功了。

2026-03-31 23:30:48 343

原创 linux——进程间的通信

父进程执行 ps aux,输出重定向到管道写端,子进程执行 grep bash,输入从管道读端获取实现:ps aux | grep bash 的效果。管道只认字节流,不认 “一条消息”,需要自己处理分包。3. 管道局限性补充(你写的很对,我补全)所有进程都关了对应 fd,管道才真正销毁。读出去就从队列移除,其他进程读不到了。管道是流式队列,不能定位、不能回退。1,管道通信:有名管道,无名管道。时,写入是原子的,不会穿插。,同一时间只能单向传数据。

2026-03-30 22:52:07 795

原创 linux——进程退出

对上述任一种终止情形,我们都希望终止进程能够通知其父进程它是如何终止的。对于三个终止函数(exit, _exit 和 _ Exit),实现这一点的方法是,将其退出状态(exit status)作为参数传送给函数,在异常终止情况下,内核(不是 进程本身)产生一个指示其异常终止原因的终止状态(termination status)。不管进程如何终止,最后都会执行内核中的同一段代码,这段代码和相应进程关闭所有打开描述符,释放它所使用 的存储器等。会炸栈,父进程拿到垃圾数据!

2026-03-29 22:34:07 256

原创 linux——创建进程

子进程在break和return后结束了,父子共用的栈被销毁了,所以父进程打印的cnt的值是随机数。区别二:vfork可以保证子进程先运行,当子进程调用exit退出后,父进程才执行。子进程正常退出,不会破坏父子共享的栈结构,cnt = 3得以保留。区别一:vfork可以直接使用父进程存储空间,不拷贝。vfork也可以创建进程,与fork有什么区别呢?子进程不退出 → 父进程永远卡住!vfork 创建的子进程。

2026-03-29 22:15:24 356

原创 linux——进程回收

时成立(return 0 /exit ())3.获取子进程结束状态(退出原因)回收成功,wpid输出子进程pid。1.阻塞并等待子进程退出。时成立(kill -9)2.回收子进程残留资源。

2026-03-26 22:32:13 168

原创 linux——孤儿进程和僵尸进程

一个比较特殊的状态,当进程退出父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会在以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。子进程的父进程一直活着 → 子进程不是孤儿!子进程打印时,父进程已经死了 → 子进程变成孤儿进程,被系统领养。父进程先运行,直接打印,然后立刻退出。

2026-03-26 22:13:08 378

原创 linux——exec函数族

* path : 要执行程序的路径(最好是绝对路径) 变参arg : 要执行的程序需要的参数 第一位arg: 占位 后边的 arg: 命令的参数 参数写完之后:null 一般执行自己写的程序 *//* file :执行的命令名字 第一个arg:占位 后边的arg:命令的参数 参数写完之后:NULL 执行系统自带的程 序:/bin/xx */ ps aux。执行PATH环境变量能够搜索到的程序 int execlp(const char *file, const char *arg, ...

2026-03-25 23:48:45 346

原创 linux——父子进程间的数据共享

对于同一个变量,读时共享 写的时候分别在物理地址上拷贝一份变量进行单独读写。父子进程之间可不可以通过全局变量通信?不能,两个进程内存不能共享。fork之后两个地址空间区数据完全相同。各个进程的地址空间中的数据是完全独立的。

2026-03-25 22:00:27 138

原创 linux——ps和kill命令

预设的信息为SIGTERM(15),可将指定程序终止。-p:指定kill 命令只打印相关进程的进程号,而不发送任何信号;的信号(SIGKILL),无法被进程忽略、阻塞或捕获,直接强制终止。的 PID 变了(因为每次执行命令都是新进程),父进程是。-a:当处理当前进程时,不限制命令名和进程号的对应关系;会显示更详细的进程树信息(PPID 父进程 ID 等)a : 显示现行终端机下的所有程序,包括其他用户的程序。进程是临时的,查完就没了,绝对不能杀它。了,进程已经不存在,所以杀不掉。的 PID,父进程是。

2026-03-25 21:35:32 361

原创 linux——进程控制

一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进 程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的 事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。子进程是克隆的父进程,所以子进程也有父进程的文本段,但是子进程是不执行父进程文本段的。一个进程,包括代码、数据和分配给进程的资源。

2026-03-24 23:08:02 305

原创 linux——进程

并发不是真正意义上的“同时进行”,只是CPU把一个时间段划分成几个时间片段(时间区间),然后在这几 个时间区间之间来回切换,由于CPU处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应 用程序同时在进行。并行:当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程 互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。其实决定并行的因素不是CPU的数量,而是CPU的核心数量,比如一个CPU多个核也可以并行。需要占用更多的系统资源。

2026-03-24 22:16:15 337

原创 linux——文件5

etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是 从/usr/lib /lib中读取的,所以想要顺利运行,可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig。这个readBuff没有显示出内容,但是文件里有内容,这是因为fputs写完之后,光标在hello world后面一位,所以不论怎么输出都是没有内容的,这时就要将光标移到最前面,就可以先出来字符了。

2026-03-23 23:11:07 706

原创 Linux——文件4

fread()──从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放 到从buffer开始的内存中;mm里面原来的内容是123456789,但是输出12345678hell,9被覆盖了,因为fread只读8位,指针移到第8位,fwrite就从第8位卡是写,写4位。需要注意的是该函数不是重定位文件指针,而是重定位文件内部的指针,让指向文件内部数据的指针移到文件中我们感兴趣的数据上,重定位主要是这个目的。文件打开了,返回一个指向该打开文件的指针(FILE结构);

2026-03-19 23:10:32 644

原创 linux——文件3

这段改进后的代码,每次读128字节,并写入文件,读到不足128字节,就退出循环,由最后的write来将最后不足128字节的内容写入文件。diff是对比两个文件内容的指令,内容一样无输出,不一样则有输出。代码太长了,图片只截了一部分,可以看到,确实是实现了。如果文件 > 1024 字节,后面内容全部丢失。读取src文件到缓存数组 read。src 源文件 des 目标文件。打开目标文件(des) open。只能拷贝小文件,大文件拷不全。写入目标文件 write。关闭目标文件和源文件。

2026-03-18 23:40:17 422

原创 linux——文件2

SEEK_END: 将读写位置指向文件尾后再增加offset个位移量,当whence值为SEEK_CUR或SEEK_END时,参数offset允许负值的出现。C语言规定了main函数的参数只能有两个,一个是argc,一个是argv并且,argc只能是整数,第二个必须是指向字符 串的指针数组。argc: 参数表示命令行中参数的个数(注意 文本名本身也是一个参数),rgc的值是在输入命令行时由系统按 实际参数的个数自动赋予的。但是应该特别注意的是,main 的两个形参和命令行中的参数在 位置上不是一一对应的。

2026-03-17 23:17:19 517

原创 Linux——文件1

返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read 返回0。pathname:文件的路径名,如果只写文件名,就默认当前目录,如果在文件名加上路径,就按照绝对路径来打开文件。O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。O_EXCL 表示如果要创建的文件已存在,则出错,同时返回-1,并且修改errno 的值。O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。

2026-03-16 23:39:46 754

原创 linux——vi编辑器

vi和vim的区别:vim是vi的升级版,基础功能两者一致,不过在嵌入式开发板中只有vi没有vim,但是在Ubuntu上我们可以使用vim编辑器,它的功能更加丰富。yx:复制若干行,x代表行数,输入2,就是复制当前行和它下面的两行(总共三行), 复制的位置由光标所在位置决定。输入完成之后,按下esc,就可以退出编辑模式,进入插入模式,按shift加:,输入wq,w是保存,q是退出。进入编辑器之后是插入模式,按下a,就可以进行编辑了,然后输入打印helloworld的代码。:+wq 保存文本并退出。

2026-03-15 22:26:40 349

原创 linux——目录及文件操作

linux指令远远不止这些,这些指令只是一些非常基础的指令,今天第一次接触linux,不是很适应,还不小心操作失误,把home目录里面的pyh目录给删掉了,导致桌面图形化组件损坏,进不去系统了。使用sudo就可以操作了,会让你输入密码,这里不显示密码,输完回车就好了。根目录里除了home目录不需要权限操作,其他目录都需要权限。rm -rf + 目录名:删除目录。1、linux目录及文件操作。ls:显示当前所在目录的文件。touch+文件名:创建文件。mkdir+目录名:创建目录。rm+文件名:删除文件。

2026-03-15 20:54:47 148

原创 C语言——函数

的值无法交换,本质是因为 C 语言的函数参数传递默认是 “值传递”,而非 “地址传递”。函数调用可以作为一个运算量出现在表达式中,也可以单独形成一个语句,对于无返回值的函数来讲。在 C 语言中,数组作为函数参数传递时,会退化为指向数组首元素的指针,而非整个数组。函数是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值。全局变量就是在函数体外说明的变量,它在程序中的每个函数里都是可见的。形参是新开辟的存储空间,因此在函数中改变形参的值,不会影响到实参。

2026-03-14 20:30:51 589

原创 C语言——指针二

可以看出,p1,p2存放的地址都是一样的,因为这里p1,p2存放的是hello world这个字符串常量的地址,所以是一样的,由于是常量,所以*p不能被修改。一级指针加1是偏移一个int的大小,二级指针加1,偏移的是一个一级指针的大小,一级指针在32位系统是4个字节,64位系统是8个字节。把一个指向指针变量的指针变量,称为指针变量 对于指向处理数据的指针变量称为一级指针变量,简称一级指针。此时p[0]指向了一维数组a[0]的第一个元素,而p[1]指向了一维数组a[1]的第一个元素。

2026-03-11 22:05:07 464

原创 C语言——指针一

在C语言中,内存单元的地址称为指针,专门用来存放地址的变量,有时对地址,指 针和指针变量不区分,统称指针。指针说明时指定的数据类型不是指针变量本身的数据类型,而是指针目标的数据类型,简称为指针的数据类型。在C语言中 ,数组的指针是指数组在内存中的起始地址,数组元素的地址是指数组元素在内存中的起始地址。如果它指向的区域是程序的一个变量的内存空间,则这个变量称为指针的目标变量,简称 为指针的目标。两个指针之间的关系运算符表示它们指向的地址位置之间的关系,指向地址大的指针大于指向地址小的指针。

2026-03-09 23:01:48 633

原创 C语言——字符数组和字符串

说明:字符数组1必须足够大,连接前,两串均以 '\0' 结束,连接后,串1的 '\0' 取消,新串最后加 ‘\0’注意strlen计算的是真实的字符串的长度,不包含字符串最后的'\0'。比较规则:对两串从左向右逐个字符比较(ASCII),直到遇到不同字符或 '\0'为止。返回值:返回字符串实际长度,不包括'\0',且遇到'\0'就停止计算。C语言中没用字符串常量,用字符数组处理字符串,字符串结束:'\0'strncat(p,p1,n),附加指定长度字符串。格式:strcpy(字符串1,字符串2);

2026-03-08 15:09:55 582

原创 C语言——数组

sizeof(数组名)是数组占用的总内存空间,编译时分配连续的内存,内存字节数=数组维数*sizeof(元素数据类型)int a[5] = {6,2,3};等价于: a[0]=6;等价于a[0]=0;所谓一维数组是指只有一个下标的数组,一般形式:<存储类型><数据类型><数组名>[<表达式>];一个int类型占用4个字节,就可以看得出来,存储地址是连续的,地址是十六进制来标识的。开始(第一个格子是 0 号,第二个是 1 号…数组可以是一维的,也可以是多维的。

2026-03-06 23:55:13 160

原创 C语言——控制语句

的本质是 “如果满足条件,就执行 A;否则,执行 B”。if(表达式)语句块1else语句块2简化形式if(x>y);printf("%d\n",x);阶梯形式if(表达式1)(语句块1); else if(表达式2)(语句块2); else if(表达式3)(语句块3); ……嵌套形式if() if()语句块1 else语句块2else if()语句块3 els

2026-03-05 22:35:54 395

原创 C语言——输入输出

这段代码我们想要的结果是输入一个数,回车之后再输入一个字符,输出数字和字符,但是上面我们提到了用“%c”格式符时,空格和转义字符作为有效字符输入,也就是说,它把我们的回车认定成要输入的字符了,这个回车就是垃圾,那需要怎么清理呢。输入的1、回车、1,输出的结果是、回车、1的ASCII值,这就是说,如果我们用用“%c”格式符时,输入的空格、回车,他会作为有效字符。输入一组数字,前四位赋值给a,然后的两位赋值给b,再然后的两位赋值给c。输入一组数字,前四位赋值给a,中间两位舍弃,然后的两位赋值给b。

2026-03-04 21:12:28 390

原创 C语言——运算符

逗号优先级最低,最后算,先算x+y+z为1,再算1>0,为真,z=1,再算y==z,为1,再算x+=y,为2,再算y=x+2,为4,最后是m=(2,4,1)=1。x为16进制数,换算后为1110 0100,左移三位,前三位舍弃,在后面补三位0,即0010 0000,换算为16进制数为0x20。x为1 && y为0,结果是假,为0,0 || z为1,结果为真,所以输出true,x,y再自增,最后结果x=2,y=1,z=1。x = 70 < 70为假,所以y输出为0,x自增1,x输出为71。

2026-03-03 00:55:07 558

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除