
进程和线程
文章平均质量分 62
modi000
生命不止,奋斗不息!
展开
-
【Linux】SIGCHLD信号
这样的写法能够满足各种子进程退出的情况,假设创建10个子进程, 它们同时退出了,每个子进程退出都向父进程发送信号, 但是pending位图只能有一个比特位记录这个SIGCHILD信号, 如果只wait一次,那么只能读取一个子进程,剩下的9个就没被读到,所以设置while循环, 不等待指定一个子进程->所以参数设定-1循环式的把所有子进程退出都读取到。如果用阻塞,上述情况下,当我们读取第6次的时候, 如果子进程不退出就在信号捕捉这里卡住了,所以使用非阻塞等待可以防止程序卡住的情况。转载 2024-03-22 13:39:24 · 144 阅读 · 0 评论 -
wait()、waitpid()函数的区别(个人总结)
首先使用wait()函数来回收多个子进程,我们可以在一个for循环中等待子进程的结束,创建了几个子进程就for循环等待几次,代码如下。waitpid函数,当第三个参数使用WNOHANG时,无子进程退出,也会立刻返回(返回值为0)waitpid函数的第三个参数设置为WNOHANG 时,返回值相较wait多了一种返回值,使用wait函数来循环回收子进程(wait函数是阻塞进程的),使用waitpid来循环回收子进程(不需要知道子进程的数量)wait函数会阻塞等待子进程的退出。使用wait()回收多个子进程。原创 2024-03-19 14:53:19 · 610 阅读 · 0 评论 -
Linux中wait()函数
如果参数status的值不是NULL,wait就会把子进程退出时的状态取出并存入其中, 这是一个整数值(int),指出了子进程是正常退出还是被非正常结束的,以及正常结束时的返回值,或被哪一个信号结束的等信息。请注意,如果进程不是正常退出的,也就是说, WIFEXITED返回0,这个值就毫无意义。函数功能是:父进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;转载 2024-03-19 13:45:13 · 996 阅读 · 0 评论 -
wait()函数——子进程回收
如果进程是异常终止,则保存导致该进程终止的那个信号。回收子进程残留资源;为什么使用了waitpid()函数还会产生僵尸进程呢,这是因为在waitpid()函数中使用了选项参数WNOHANG,而子进程中有一个睡眠函数,子进程睡眠的时候,父进程中waitpid()语句没有等到子进程结束就执行了,由于WNOHANG选项参数的存在,waitpid不会阻塞等待之进程结束,而是直接返回。当waitpid()返回父进程中后,子进程才结束,但是waitpid()已经执行完了,所以并没有回收子进程,子进程因此变成僵尸进程。转载 2024-03-18 20:52:47 · 129 阅读 · 0 评论 -
通过多线程并发方式实现服务器
【代码】通过多线程并发方式(fork)实现服务器。原创 2024-02-29 00:15:20 · 735 阅读 · 0 评论 -
Linux之循环创建多个子进程
但是shell进程不知道还有子进程,当父进程执行完(打印了 I am parent),shell进程抢占了前台,恢复到正常状态,此时子进程3用了终端,所以这句话( I am 3 child, pid = 19810)就没打印到下一行的行首,而是直接打印到光标的后面的位置上,打印完之后,做了个换行,光标移到下一行起始位置,这时候子进程2又抢占了终端,在光标之后打印了一句话……当我去掉所有的sleep函数之后,父进程和子进程以及shell进程之间共同抢夺CPU,shell进程并不知道父进程又创建了子进程。转载 2024-02-29 00:02:47 · 185 阅读 · 0 评论 -
通过多进程并发方式(fork)实现服务器(注意要回收子进程)
2、子进程完成数据交互后,close(cfd);此时成为僵尸进程,所以需要在父进程中收尸,回收进程描述符等资源。但此时父进程在accept,无法waitpid(),此时使用signal的方式SIGCHILD来解决收尸问题,当子进程成僵尸进程后,由内核自动回收。调用fork()创建子进程后,子进程继承cfd,lfd,通过该cfd与连接过来的客户端通信,lfd对子进程来说没用,可以直接close(lfd);对于父进程来说,只是用来建立连接的,故父进程中的cfd没有用,直接close(cfd);原创 2024-02-28 23:52:08 · 624 阅读 · 0 评论 -
pthread_cond_timedwait()函数
相对时间:相对于当前时间,如sleep(3);相对于当前,过3s.绝对时间:相对于1970年1月1日0时0分0秒。原创 2024-02-25 14:57:59 · 485 阅读 · 0 评论 -
pthread_dedach()注意事项
线程为分离态的注意,如上图所示。原创 2024-02-25 01:23:39 · 377 阅读 · 0 评论 -
phtread_cancel函数用于取消线程,但不是实时的
如上图所示,线程函数中没有取消点(一般是一些系统调用----man 7 pthreads查看,自定义函数是无效的),则使用pthread_cancle函数不生效。pthread_join回收的线程已经被phread_detach了的话,会报错,错误号是22;通过pthread_join回收的线程已经被phread_cancel了的话,返回值是-1;解决方法:可以添加pthread_testcancle();原创 2024-02-25 01:07:53 · 516 阅读 · 0 评论 -
C语言四大存储区域总结
4.堆区--------由malloc,calloc分配的内存区域,其生命周期由free决定。3.栈区--------主要存储局部变量,栈区上的内容只在函数范围内存在,当函数运行结束,这些内容也会自动被销毁。原文链接:https://blog.youkuaiyun.com/yue_jijun/article/details/81192102/2.数据区------主要存储全局变量(常量),静态变量(常量),常量字符串。1.代码区--------主要存储程序代码指令,define定义的常量。转载 2024-02-24 20:53:43 · 360 阅读 · 0 评论 -
线程共享和非共享的资源及线程优缺点
注意:共享的内存地址空间中不包括栈;共享文件描述符表,表示,同一进程中线程可以操作同一文件。原创 2024-02-24 20:35:16 · 413 阅读 · 0 评论 -
在线程调用的函数中使用pthread_exit同样会将线程退出
如上图所示,在func()函数中调用pthread_exit,同样可以退出当前线程;类似的,如果func()函数中调用exit,可以直接退出整个进程。原创 2024-02-24 20:25:30 · 409 阅读 · 0 评论 -
基础知识——嵌入式内存使用分析(text data bss及堆栈)
从可执行程序的角度来说,如果一个数据未被初始化,就不需要为其分配空间,所以.data 和.bss 的区别就是 .bss 并不占用可执行文件的大小,仅仅记录需要用多少空间来存储这些未初始化的数据,而不分配实际空间。堆的地址空间是向上增加,即当堆上保存的数据越多,堆的地址越高。注意:堆内存需要程序员手动管理内存,通常适用于较大的内存分配,如频繁的分配较小的内存,容易导致内存碎片化。栈的另外一个重要特征是,它的地址空间 向下减少,即当栈上保存的数据越多,栈的地址越低。By——口袋里のInit。转载 2024-02-24 20:18:51 · 501 阅读 · 0 评论 -
【Linux】生产者消费者模型代码实现和信号量
实际上我们在这里用if判断是有bug的,因为我们不仅仅可以一次唤醒一个线程,也可以唤醒多个线程,当我们唤醒多个线程的时候,如果只用一个if判断就会造成生产者生产的数据超过队列上限,因为是多个线程同时被唤醒生产。当然我们的阻塞队列在满的时候是不能生产的,这个时候我们应该将生产者放到条件变量里。之前我们讲进程间通信的时候提到过信号量,那时候我们对信号量的描述是:信号量(信号灯),本质上是一个计数器,计数器需要++和--操作,但是由于多线程并发访问的问题,所以我们的信号量++ --操作一定要是原子的。转载 2024-02-22 13:20:13 · 278 阅读 · 0 评论 -
生产者和消费者问题个人总结
使用while而不是if,这仍然是因为pthread_cond_wait会京mutex解锁原因,判断这个时候,是否有其他同类线程已经“捷足先登”了,导致又没资源了。同时,我们发现,当互斥量与条件变量配合使用的时候,则是互斥量在前,pthread_cond_wait()在后,这是因为,实现互斥的P操作一定要在实现同步的P操作之后。函数是个原子操作,如出现阻塞,则会先将互斥量解锁,不会出现死锁的情况。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。根据各进程的操作流程确定P、V操作的大致顺序。原创 2024-02-21 23:58:45 · 367 阅读 · 0 评论 -
【操作系统】生产者消费者问题(使用互斥量和条件变量)
例如(调换后),将consumer的两个wait调换,在producer发出signal信号后,如果producer线程此时再次获得运行机会,执行完了wait(space),此时,另一个consumer线程获得运行机会,执行了 wait(mutex) ,如果此时缓冲区为空,那么consumer将会阻塞在wait(items),而producer也会因为无法获得锁的所有权所以阻塞在wait(mutex),这样两个线程都在阻塞,也就造成了死锁。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。转载 2024-02-21 19:42:24 · 2120 阅读 · 0 评论 -
生产者-消费者问题(有例题!!!)(使用互斥量和信号量完成)
问题描述系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)生产者、消费者共享一个初始为空、大小为n的缓冲区。只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。缓冲区是临界资源,各进程必须互斥地访问。解释:在刚开始,由于这个缓冲区全部是空的,所以生产者进程可以生产一些产品,把它放入到这个缓冲区当中。转载 2024-02-21 19:34:45 · 231 阅读 · 0 评论 -
获取线程id的方法
参考该文。 我们发现,调用syscall获取的id与ps命令获取的相同。pthread_self 是posix描述的线程ID(并非内核真正的线程id),相对于进程中各个线程之间的标识号,对于这个进程内是唯一的,而不同进程中,每个线程的 pthread_self() 可能返回是一样的。所以,获取线程真正的id方法:............原创 2022-06-09 10:24:12 · 2811 阅读 · 0 评论 -
pthread_cancel pthread_testcancel测试
pthread_cancel用于取消一个线程,但被取消的线程要有取消点,才能被取消。pthread_testcancel用于设置取消点运行结果:转载 2022-06-08 16:17:30 · 269 阅读 · 0 评论 -
(转)Linux 多线程编程---pthread_testcancel()等讲解
1. 所谓线程就是“一个进程内部的一个控制序列”。也就是一个进程内部的并行的基础!2. Linux进程可以看成只有一个控制线程: 一个进程在同一时刻只做一件事情。有了多个控制线程以后, 在程序设计时可以把进程设计成在同一时刻能够做不止一件事, 每个线程处理各只独立的任务。即所谓并行! 3. 线程的优点: (1)通过为每种事件类型的处理分配单独的线程,能够简化处理异步时间的代码。 (2)多个线程可以自动转载 2022-06-08 16:14:32 · 2001 阅读 · 0 评论 -
创建线程的心得
当编写程序的时候,一个分支是个死循环时,为了不耽误接下来的代码顺序执行,此时就可以起一个线程,用来单独执行死循环程序。qq原创 2022-06-07 13:15:11 · 491 阅读 · 0 评论 -
socket实现进程间通信示例
服务器端程序:客户端程序:原创 2022-06-07 13:10:20 · 425 阅读 · 0 评论 -
在子线程中创建子线程及线程查看方法
小结:我们看到,son线程的退出,并没有影响到孙线程的运行,因为进程并未退出。 以上述方式一的形式查看线程:1)同一进程中的线程是平等的,没有父子之分。当然也包括所谓的主线程、在主线程中创建的线程、在所谓的子线程中创建的线程。线程既然是平等的,只要进程不退出,倘若son线程退出,我们看到不会影响到孙线程的运行。2)孙线程在子线程中创建,可以理解为,启动孙线程的顺序点是在此时,而并非在主线程中。也就是说,我们可以在任意我们需要创建一个平行任务的地方,创建一个子线程,而并非得在主线程中创建。3)线程函数,其实,原创 2022-06-02 09:44:39 · 2875 阅读 · 1 评论 -
Linux 线程调度与优先级
【转】Linux下线程学习笔记(一)-frankzfz-ChinaUnix博客Linux下线程的调度策略与优先级(一)-frankzfz-ChinaUnix博客Linux内核的三种调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃 3,SCHED_RR实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的R转载 2022-06-01 09:30:02 · 3372 阅读 · 0 评论 -
Linux access函数讲解
函数:#include<unistd.h>int access(const char* pathname, int mode);参数介绍: pathname 是文件的路径名+文件名 mode:指定access的作用,取值如下F_OK 值为0,判断文件是否存在X_OK 值为1,判断对文件是可执行权限W_OK 值为2,判断对文件是否有写权限R_OK 值为4,判断对文件是否有读权限注:后三种可以使用或“|”的方式,一起使用,如W_OK|R_...转载 2022-05-31 15:46:08 · 8009 阅读 · 0 评论 -
使用fopen函数读属性判断文件是否存在
int func(char *pName){ FILE *fp; fp = fopen( pName, "r" ); if( fp != NULL ) { fclose( fp ); return 1; } return 0;}利用fopen的 可读属性判断文件是否存在。注意:fopen以读的形式打开文件,只有当文件不存在时,返回值才为空如果文件的没有可读属性,只要文件存在,也是可以被打开,并读出其内容的。.原创 2022-05-31 10:27:12 · 2744 阅读 · 0 评论 -
man posix_spawn
以下是在ubuntu上看到的,凝思系统上该函数能用,找不到man配置。POSIX_SPAWN(3) Linux Programmer's Manual POSIX_SPAWN(3)NAME posix_spawn, posix_spawnp - spawn a processSYNOPSIS ...原创 2022-05-31 10:02:06 · 718 阅读 · 0 评论 -
使用SIGCHLD信号捕捉子进程状态
如题,使用SIGCHLD信号,为子进程收尸,同时捕捉子进程的退出的状态;实现效果:1)回收子进程资源;2)进程重启(当发现子进程退出后,重启该进程)int ret,g_pid;extern char **environ;char* process_name;main(){ if (signal(SIGCHLD, child_end) == SIG_ERR ) { printf("can't signal(SIGCHLD, child_end)原创 2022-05-31 09:33:11 · 430 阅读 · 0 评论 -
TZ环境变量,时区
如上例所示,代码段 setenv( "TZ", "CST-08", 1 );//设置东八区 北京时间 tzset();// 这条代码执行的意思是什么?待解决。转载:TZ环境变量,时区,夏令时_pirate_sir的博客-优快云博客_tz环境变量#include <stdio.h>#include <sys/time.h>#include <stdlib.h>#include <unistd.h> /**...原创 2022-05-30 16:30:51 · 3584 阅读 · 0 评论 -
linux系统有线程描述符吗,linux--fork后父子线程共享文件描述符的理解
本篇文章主要总结下共享文件描述符,系统文件表,内存中索引结点表这几个概念。fork进程后,父子进程共享文件描述符这点其实很不好理解,同时也很重要,在管道,信号等应用中都可能会设计到,通过查阅网上的资料,整理如下概念介绍在C程序中,文件由文件指针或者文件描述符表示。ISO C的标准I/0库函数(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用文件指针,UNIX的I/O函数(open, close, read, write, ioctl)使用文件描述转载 2022-05-30 12:23:07 · 358 阅读 · 0 评论 -
【Linux 进程】fork父子进程间共享数据分析
之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享。接下来我们就来分析分析父子进程是否存在着数据共享。我们都知道,在linux下,内存存储的位置是全局变量,栈区,堆区,以及文件。字符常量区我们这里不作分析。下面我们依次以实际代码来验证它们是否存在着数据共享。所谓的父子进程数据共享,通俗点说就是父进程或者子进程对于数据的更改,会使得子进程或者父进程的数据同步更改。代码检测的思想是让父子进程中的一个修改数据,未对转载 2022-05-30 11:13:09 · 3896 阅读 · 0 评论 -
理解mmap()
mmap, 从函数名就可以看出来这是memory map, 即地址的映射, 是一种内存映射文件的方法, (其他的还有mmap()系统调用,Posix共享内存,以及系统V共享内存,这些我们有机会在后续的文章讨论,今天的男主角是mmap),将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),w转载 2022-05-30 10:48:05 · 372 阅读 · 0 评论 -
SystemV 和Posix两种方式实现共享内存
正如实现信号量的方式有SystemV 和Posix两种形式,实现共享内存也有SystemV 和Posix两种形式,参考该文和该文和该文一、Posix形式:(常用)i用到如下函数:shm_openmmapftruncateshm_unlink二、System V 形式:参考该文。#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sy.原创 2022-05-30 09:45:41 · 564 阅读 · 0 评论 -
linux 内存文件共享,两种Linux共享内存的比较
现代Linux有两种共享内存机制:POSIX共享内存(shm_open()、shm_unlink())System V共享内存(shmget()、shmat()、shmdt())其中,System V共享内存历史悠久,一般的UNIX系统上都有这套机制;而POSIX共享内存机制接口更加方便易使用,一般是结合内存映射mmap用。mmap和System V共享内存的主要区别在于:sysv shm是持久化的,除非被一个进程明确的删除,否则它始终存在于内存里,直到系统关机;mmap映射的内存在不是持久转载 2022-05-30 09:19:12 · 1902 阅读 · 0 评论 -
mmap映射区和shm共享内存的区别总结
linux中的两种共享内存。一种是我们的IPC通信System V版本的共享内存,另外的一种就是我们今天提到的存储映射I/O(mmap函数)在说mmap之前我们先说一下普通的读写文件的原理,进程调用read或是write后会陷入内核,因为这两个函数都是系统调用,进入系统调用后,内核开始读写文件,假设内核在读取文件,内核首先把文件读入自己的内核空间,读完之后进程在内核回归用户态,内核把读入内核内存的数据再copy进入进程的用户态内存空间。实际上我们同一份文件内容相当于读了两次,先读入内核空间,再从内核空间转载 2022-05-30 08:52:01 · 715 阅读 · 0 评论 -
子线程先于主线程退出
参考该文,该文中已经列举了多种方法,实际中还可以如下操作:例如:当进程中有多个子线程,子线程中还有子线程。可以设计如下:进程中可以只对一个死循环的子线程中使用phtread_join操作,从而保证进程不退出。进程中的其他线程可以都使用 pthread_detach(pthread_self());(无论是进程中的,还是线程中的子线程),保证线程结束后,资源能够回收。...原创 2022-05-24 09:25:44 · 528 阅读 · 0 评论 -
线程和进程同步及进程间通信总结
一、线程(或进程)同步的理解互斥:两个线程(进程)不能同时访问同一资源,访问资源的顺序不确定。同步:两个线程(进程)具有一定的先后顺序来访问同一资源。(互斥的同时,线程(进程)需按照先后顺序访问资源。)比如:生产者和消费者,必须是现生产了才能消费;消费了才能有空地,继续生产。二、线程同步机制1、互斥锁1)如果一个线程加了锁,正在访问共享资源,失去了cpu,此时另一个线程没加锁,也是能访问共享资源的。这样就造成了混乱。解决方法:访问共享资源的线程都要加锁。2)pthread_t原创 2022-05-21 10:11:26 · 1717 阅读 · 0 评论 -
最全面的linux信号量解析
信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。二.信号量的分类在学习信号量之前,我们必须先知道——Linux提供两种信号量:(1) 内核信号量,由内核控制路径使用(2) 用户态进程使用的信号量,这种信号量又分为POSIX信号量和SYSTEMV信号量。POSIX信号量又分为有名信号量和无名信号量。有名信号量转载 2022-05-19 10:57:07 · 3818 阅读 · 0 评论 -
进程间通信-信号量
#include <semaphore.h>int sem_init(sem_t *sem, int pshared, unsigned int value);Link with -pthread. sem_init() initializes the unnamed semaphore at the address pointed to by sem. The value argument specifies the initial value for t.原创 2022-05-19 00:00:29 · 150 阅读 · 0 评论