进程与线程(一)

项目实训(四)——SAM模型的学习与部署 这里的show_mask就是我们用mask的prompt进行分割,show_points就是我们用points进行分割,show_box就是通过box进行分割,这是SAM的三种prompt的方式。总的来说,Meta AI 的 Segment Anything 模型为我们提供了一种全新的物体识别和分割方式,其强大的泛化能力和广泛的应用前景将极大地推动计算机视觉领域的发展。这里有vit_h、vit_b、vit_l三种权重模型,这里可以根据自己的需要下载相应的权重模型。我们是下载的vit_h权重模型。 阅读详情

        进程和线程都是现代操作系统中程序运行的基本单位,进程是一个具有独立功能的程序关于某个数据集合上的依次并发执行的运行活动,从进程演化出线程的主要目的就是为了更好地支持多处理器系统,提高性能;

        在单线程结构的进程中,进程及时内部独立的执行单元,也是独立竞争资源的基本单元;

        在多线程结构的进程中,进程是系统进行资源分配和保护的基本单元,而线程是进程内的独立的执行单元,线程不能离开进程和独立存在;

        线程包含独立的堆栈和处理器及寄存器状态,每个线程共享其所附属的进程的所有资源;

       一、进程

        Linux操作系统使用一个称为进程控制块的数据结构task_struct来表示一个进程。当一个进程被创建时,系统为该进程建立一个task_struct结构,当进程结束时,系统会回收进程的task_struct结构;

       进程可以产生子进程, 每一个进程都有一个标志,即进程ID,可通过getpid()函数获得其进程ID,通过getppid()函数获得其父进程ID,还有一些不常用函数,getpgrp()获得进程组ID,getpgid(pid_t pid)获得制定pid进程所属组的ID,getuid()获得进程所有者的ID,geteuid()获得进程有效用户的ID以及getegid()获得进程有效组ID;

       1、进程的创建

        一般情况下是使用fork(), vfork()两个函数来创建新的进程的,函数原型如下:

        pid_t  fork(void);

        pid_t  vfork(void);

  这两个函数调用一次返回两次,向父进程返回刚创建子进程的ID,向子进程返回0,调用失败时,父进程返回-1,没有子进程创建。

        fork()函数与vfork函数的区别:

        调用fork函数时,子进程与父进程使用同一个代码段,因为其程序相同,对于数据段和堆栈段,系统则复制一份给新进程,并采用写时复制(copy-on-write)的技术,即当数据发生变化时,系统将有区别的页从物理上分离,使得在空间上的开销达到最小;fork()创建的子进程与父进程的执行顺序是无法控制的,需通过一系列的机制进行控制;

        调用vfotk函数时,vfork()函数创建的子进程与父进程共享地址空间,即子进程完全运行在父进程的地址空间上,子进程对虚拟地址空间任何数据的修改同样为父进程可见,但是vfork()函数创建子进程后,父进程会被阻塞,知道子进程执行execv()或者exit();

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

int main(void)
{
   int data = 0;
   pid_t pid;
   int choose = 0;
   while((choose = getchar()) != 'q')
   {
      switch(choose)
      {
      case '1':
          pid = fork();
          if(pid < 0)
             perror("Error!\n");
          if(pid == 0)
          {
             data++;
             exit(0);
          }
          wait(pid);
          if(pid > 0)
            printf("data is %d\n",data);
          break;
      case '2':
          pid = vfork();
          if(pid < 0)
             perror("Error\n");
          if(pid == 0)
          {
             data++;
             exit(0);
          }
          wait(pid);
          if(pid > 0)
          {
             printf("data is %d\n",data);
          }
          break;
       default:
          break;
      }
   }
}

运行结果:

      2.关于exec()类函数

       <1>int  execl(const char *path,const char *arg,...);

       <2>int  execlp(const char *file,const char *arg,...);

       <3>int  execle(const char *path,const char *arg,...,char * const envp[])

       <4>int execv(const char *file, char * const  arg[],...);

       <5>int  execve(const char *filename,char * const argv[],char *const envp[] );

       <6>int execvp(const char *file,char *const argv[]);
       后缀为p时,可以利用DOS的PATH变量查找到可执行文件;

       后缀为l时,接受以逗号分隔的参数列表,列表以NULL指针作为结束标识;例:execl("/homr/robot/test",“test”,a,b,c,NULL),一般第一个参数为可执行文件名,a,b,c均为参数;

       后缀为v时,接收以NULL结尾的字符串数组的指针,例:char *argv[] = {"/bin/cat","etc/passed","etc/group",NULL};

       后缀为e时,传递指定参数envp;

       以execlp函数为例:

#include <stdio.h>
#include <error.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
char command[256];

void main()
{
   int rtn;
   while(1)
   {
      printf(">");
      fgets(command,256,stdin);
      command[strlen(command)-1] = 0;
      if(fork() == 0)
      {
          execlp(command,command,NULL);
          perror(command);
          exit(-1);
      }
      else
      {
          wait(&rtn);
          printf("child process return %d\n",rtn);
      }
   }
}

      结果如下:


         3、进程等待

          与vfork()不同,fork()创建的子进程与父进程的执行顺序是无法控制的,如果想要控制,必须有父进程使用wait()或waitpid(),其中wait()返回任一终止状态的子进程,而waitpid()等待特定的子进程。

           #include<sys/types.h>

           #include<sys/wait.h>

           pid_t wait(int *status);

           pid_t waitpid(pid_t pid,int *status,int options);

           对于wait():参数status用于保存被收集进程退出时的状态,它是一个指向int类型的指针,进程一旦调用wait(),将立即阻塞自己,由wait自动分析当前进程是否有某个子进程退出,如果找到一个已经僵死的子进程,wait()将收集這个子进程的信息,并彻底销毁后返回,若没有找到一个僵死的进程,将一直阻塞,即等待,如果不关心子进程的退出状态,可以设置为NULL;

           对于waitpid():pid>0时,等待进程ID为pid的子进程,pid= -1时,等待任何一个子进程退出,此时与wait函数差不多,pid = 0时,等待同一个进程组的任何子进程,如果子进程加入了其他进程组,则waitpid()函数不会对他做任何理睬,pid < -1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值;optiona 可以进一步控制waitpid()函数的操作,参数值可以为0,也可以为WNOHANG(如由pid指定的子进程并不立即可用,则waitpid()函数不阻塞,返回0)和WUNTRACED(如pid指定的任一子进程已暂停,且未报告过,即没有获得其状态,则返回status).

          

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
   pid_t pc,pr;
   pc = fork();
   if(pc < 0)
        printf("Error occured on forking.\n");
   else if(pc == 0)
   {
       sleep(10);
       exit(0);
   }
   else
   {
       do{
          pr = waitpid(pc,NULL,WNOHANG);
          if(pr == 0)
          {
              printf("No child exited\n");
              sleep(1);
          }
       }while(pr == 1);
       if(pr == pc)
          printf("successfully get child %d\n",pr);
       else
          printf("some error occured\n");
   }
   return 0;
}


         结果如下:

         关于参数status:

         如果参数status的值不是NULL,wait()或者waitpid()会把子进程退出时的状态取出并放入其中,由于这些信息存放在一个整数的不同二进制位中,Linux提供了6个宏用来检查子进程的返回状态;

          <1>WIFEXITED(status),如果子进程通过_exit()或者exit()正常退出,则该宏为真,此时可执行WEXITSTATUS(status)获取子进程传送给_exit()或exit()参数的低八位;

          <2>WIFSIGNALED(status),如果子进程是由于得到的信号没有被捕捉而导致退出,则为真,此时可通过WTERMSIG(status)取出子进程终止的信号编号;

          <3>WIFSTOPPED(status),如果子进程没有终止,但停止并可以重新执行时,返回真,仅出现在waitpid()中使用了WUNTRACED时;

          <4>WEXITSTATUS(status),得到status的低八位,即退出码;

          <5>WTERMSIG(status),得到导致进程退出的信号编号;

          4.进程终止
          一般情况下,进程通过exit()或_exit()进行退出;

          函数原型:

#include <stdlib.h>
void exit(int status);

#include <unistd.h>
void _exit(int status)

          exit()和_exit()的区别:

          _exit()直接使进程停止运行,而调用exit()之前要检查文件的打开情况,把文件缓冲区的内容写回文件。

/*exittest.c*/
#include <stdio.h>
#include <stdlib.h>

int main()
{
   printf("output begin\n");
   printf("content in buffer");
   exit(0);
}


/*_exittest.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
   printf("output begin!\n");
   printf("content in buffer");
   _exit(0);

           结果如下:    

 




RK3568驱动XS9922B:AHD/CVBS双模摄像头兼容性实战 在嵌入式视频开发中,摄像头驱动的稳定性与兼容性往往决定项目交付质量。Linux内核的V4L2框架提供了统一的视频采集抽象,从v4l2_subdev子设备到media controller链路,再到用户态视频节点,每一层都需要精确配置。对于RK3568这类边缘计算平台,其MIPI CSI接口和自研ISP配合RKCIF,构成了完整的多路视频接入通路。当需要接入模拟视频解码芯片时,驱动设计就需同时考虑AHD高清协议与CVBS标清信号的模式切换、格式协商以及寄存器配置。XS9922B作为支持双模输入的解码芯片,可与 阅读详情

相关推荐

matlab内读取文件目录时斜杠和反斜杠的使用

@matlab内读取文件目录时斜杠和反斜杠的使用TOC matlab内读取文件目录时,斜杠和反斜杠的使用 最近被斜杠和反斜杠弄晕了,于是总结了一下,在此和大家分享一下。 代码 clear; clc; close all; I1= imread('..\zs1.jpg'); %和代码文件夹同目录的图片 (纯反斜杠) I2= imread('../zs2/zs2.j...

weixin_44456694的博客 6572

【Linux之路】进程与线程(一)

1, Linux进程组成:        1)进程控制块

u010743187的专栏 655

SQL Prompt 9.0插件突然无法使用解决办法(附防联网激活)多图+文字

可能由于Redgate公司最近抓盗版抓得严,导致激活后的SQL Prompt联网后突然无法使用,无论卸载重装都没办法继续使用,本人同时使用SQL Assistant和SQL Prompt,我喜欢SQL Assistant代码提示功能,而SQL Prompt我喜欢将查询结果复制后可以直接生产插入脚本,这是最爽的一件事,即便对表有多么熟悉,没有这些插件,几行语法都要敲大半天,目前本人已经离不开这两个插...

骚团长的博客 1万+

关于linux wait()函数返回值的问题

今天看linux进程的时候发现wait函数的返回值似乎和书上说的不一样,书上是这么说的 wait函数的原型是:pid_t wait(int *status) 参数 status 用来保存被收集进程退出时的状态,它是一个指向 int 类型的指针。但如果不关心子进程是如何死植的,而只想把该僵死进程销毁(事实上绝大多数是这种情况),则可以设置参数为 NULL,其调用形式如下∶ pid = wait(NULL); 如果成功,wait( )会返回被收集的子进程的进程 ID;如果调用进程没有子进程,则会失败,此时 w

Little Big Us的博客 2659

疲劳容器的定义_FKM规范针对非焊接构件疲劳强度评估实例介绍(下篇)

一、写在前面FKM Inside ANSYS软件,该软件是在FKM 规范的基础上,在ANSYS Workbench内开发的进行非焊接构件及焊缝静强度和疲劳强度评估的工具包。基于ANSYS计算模型的信息,在图形用户界面定义相关设置,利用有限元分析计算结果,自动嵌入FKM规范要求的静强度计算和疲劳强度计算流程和方法,自动将应力结果和相关物理量传递给工具包,无须手动预先选择评估的热点区域,可以...

weixin_35925298的博客 1885

告别玄学调试:手把手教你读懂全志芯片的sys_config.fex配置文件(以i2c配置为例)

本文深入解析全志芯片的sys_config.fex配置文件,以I2C设备驱动为例,详细讲解从引脚定义到驱动加载的全过程。通过实战案例和高级调试技巧,帮助开发者快速掌握硬件配置与内核驱动的联动机制,提升开发效率。

weixin_33737134的博客 418

小何讲进程: 阻塞进程函数 wait()和waitpid()

wait() 进程一旦调用了wait(), 就立即阻塞自己,由wait自动分析是否有当前进程的某个子进程已经退出,如果让它找到了一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到一个子进程结束或者该进程接到了一个指定的信号为止。 waitpid() waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait

好儿郎~志在四方 9916

3D Slicer学习记录(4)-PLUSapp连接双目相机Intel Realsense

plusapp是基于openIGTLink协议的免费的开源库和应用程序API接口,用于数据采集、预处理、校准和实时流成像、位置跟踪和其他传感器数据。这里以intel realsense双目相机为例详细的演示整个图像流导入到3D Slicer的流程。

weixin_39090239的博客 1345

JAVA进程与线程(一)

一、进城和线程的概念 (一)进程 操作系统中的各个应用程序,这些应用程序是一些不同的任务,这些任务一起工作构成了操作系统的基本功能。 进程的本质就是一些系统内存,每个进程占据一定的资源。 (二)线程 进程中包含的一个或多个执行单元(子任务,线程),例如360安全卫士中:可以进行病毒查杀、加速、电脑清理……等工作。这些功能是当前360安全卫士中的一些子任务,最后这些任务放在一起就称为了最终360安全...

超域的博客 618

【WRFDA教程】客观分析(OBSGRID)详解

客观分析(OBSGRID)详解

WW、forever的博客 1133

PCL 平面点云的凹多边形边界提取【2025最新版】

平面点云的凹多边形边界提取及边界轮廓线绘制。博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 7183

一、进程与线程

类比对象含义解释程序菜谱(静态)进程正在做菜的厨师(动态执行)线程厨师的双手(并行协作)调度器城管,决定谁干活谁休息时间片每个进程分到的摊位使用时间上下文工作现场的记忆(寄存器、栈状态)切换上下文厨师交接工作,记录上次做到哪程序是菜谱,进程是厨师,线程是双手,调度靠城管。厨师多效率高,但容易打架(死锁、竞争);各司其职,共享资源,安全加锁,效率与稳定并重。这就是进程与线程的本质与区别:进程负责“资源与隔离”,线程负责“并行与速度”。

bamboo_tt的博客 828

HDMI接口及其在编程中的应用

在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文将介绍HDMI接口的基本原理以及如何在编程中使用HDMI接口。在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文介绍了HDMI接口的基本原理,并提供了使用Python编程语言和相关库实现HDMI接口应用的示例代码。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。

CodeByte的博客 802

【进程、线程、协程】进程与线程的区别(一)

进程与线程的区别 1.线程:单个线程里的内存空间数据共享。线程是cpu执行的基本单位,每个进程默认带一个线程。 2.进程:物理内存空间隔离(多个进程内存空间彼此隔离) 同一个进程下的多个线程共享该进程内的数据 3.创建数据 造出线程的数据要快于进程:进程是告诉操作系统开辟内存空间, 即:进程开启子进程的pid号不一样...

qq_16761099的博客 675

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Linux:线程的概念、与进程区别及内核实现(线程一)

线程(Thread)是进程内的独立执行流,是操作系统调度的基本单位。简单理解:进程是 “资源分配的容器”,而线程是 “容器里真正干活的执行者”—— 一个进程至少包含一个主线程,多个线程共享进程的全部资源(虚拟地址空间、文件描述符、信号表等),但拥有独立的执行上下文(CPU 寄存器、栈空间)线程是进程内的独立执行流,共享进程资源,调度成本低Linux 中线程本质是轻量级进程,通过描述,共享mm_struct区分于进程入门线程编程的核心是掌握 pthread 库的基本使用,理解线程的创建与回收流程。

hello world/linux 1553

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

进程与线程(一)

并发是什么?—》多个任务同时运行任务是什么?—》就是一个应用程序思考:程序是如何产生的?—》程序:一组能被计算机直接识别的有序指令的集合所以:程序是被编译生成的 eg:gcc test.c -o App (App就是一个程序)程序在外存(U盘,硬盘)上存储(静态的概念)一个程序一旦被运行起来,就会产生一个进程(动态的:被创建,被调度,被消亡)

xuezhe_____的博客 917

线程与进程(一)

进程是操作系统中执行的一个程序实例。它包含了程序代码和它的活动。每个进程都有自己独立的内存空间和资源,如文件描述符、网络连接等。进程就是正在运行中的程序(进程是驻留在内存中的)

z2331198564653的博客 1233

多线程一 进程与线程

1.进程与线程 进程:操作系统中一个程序的执行周期为一个进程 线程:一个程序同时执行多个任务,一个任务称之为线程; 线程的优点: 创建一个新线程的代价要比创建一个新进程小得多 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多 线程占用的资源要比进程少很多 能充分利用多处理器的可并行数量 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务 计算密集型应用,为了能在多处理器系统...

ITdong的博客 262

【Linux】进程(一)Linux下的进程与线程

什么是LWP? LWP与pthread_create创建的线程之间的关系 轻量级进程ID与进程ID之间的区别

量变产生质变 585

二、进程管理(一)进程与线程

在多道程序环境下,允许多个程序并发执行。传统的程序本身是一组指令的集合,是一个静态的概念。引入进程(Process)的概念来描述多个程序并发执行的动态过程。

24考研人晴落的博客 1557

(一)进程与线程

一、进程与线程 二、并行与并发

yirenyuan的博客 443

多线程(一)程序,进程,线程的区别与联系

程序、进程、线程的概念 程序是指令的有序集合,被存储在磁盘或其他的数据存储设备中,是一个静态概念,其本身没有任何运行的含义。 进程是指一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统运行程序的基本单位,因此进程是动态的。 线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。 程序

qq_42856647的博客 5448

python进程与线程(一)

一、进程和线程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个微信就启动了一个微信进程,打开一个淘宝就启动了一个淘宝进程,有些进程还不止同时干一件事,比如看视频进程,它可以同时运行视屏、音频、字幕等等事情。在一个进程内部,要同时干很多事情,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。 由于...

xjtuse123的博客 750
上一篇: Shell脚本语法
下一篇: 进程与线程(二)
float_wind
博客等级 码龄11年 2粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值