首页 > 系统相关 >进程

进程

时间:2023-04-13 16:12:44浏览次数:29  
标签:fork void pid 进程 include id

进程

进程控制块PCB

任何进程在运行时都会有一个进程信息; 可以使用ps aux查看部分信息。

task_struct

进程id C语言中用pid_t类型表示

进程状态:运行、停止、僵尸等

进程切换时保存和恢复的一些CPU寄存器

控制中断

当前工作目录

umask掩码

文件描述符表,包含指向很对file结构体的指针

用户id和组id

和信号相关的信息

控制终端、session

进程可以使用的资源上限Resource limit

进程控制fork

fork

根据一个现有进程复制出一个基本一模一样的新进程,可以使用pstree查看进程图谱,

fork

#include<unistd.h>
pid_d fork(void);

除了pid不同,其他的两个进程都相同,包括内存寄存器相同。

但信号量、内存锁、信号锁都不相同。

调用失败返回-1

父进程拿到的pid返回值大于0,子进程拿到的pid = 0 ;

#include<stdio.h>
#include<unistd.h>
#incldiue<stdlib.h>
int main(void){
    char* msg;
    int n = 0 ;
	pid_t pid = fork();
	if(pid < 0){
		perroe("fork");
		exit(1);
	}
	if(pid = 0){
		//子进程
        msg= 'child process~\n';
        n = 6;
	}else{
        msg = "parent process\n";
		n = 3;
	}
    while(n > 0){
		printf(msg);
        sleep(1);
        n--;
    }
	return 0 ;
}

image-20230413132854730

父进程结束了,子进程还在输出,运行结果看内存调度情况,情况随机

image-20230413132933991

僵尸进程与孤儿进程

僵尸进程 一个进程死掉之后,父进程会释放孩子进程的资源,若一个进程已经死掉,但是其占用的资源没有被释放,则此时孩子进程变成了僵尸进程。

孤儿进程 其父进程已经死掉,则此进程被称为孤儿进程,后续的孤儿由1号进程收留。

练习

#include<sys/types.h>
#incldue<unistd.h>

pid_t getpid(void);
pid_t getppid(void);

fork在子进程中返回0 ,子进程可以调用getpid得到自己进程id,调用getppid得到父进程的id;

而父进程可以使用getpid得到自己的id,但是其子进程的id只有在fork的时候做记录才知道。

创建10个子进程,并打印他们的id和pid

#include<stdio.h>
#include<unistd.h>
#incldiue<stdlib.h>
#include<sys/types.h>
int main(void){
    char* msg;
    int n = 0 ;
    for(int i = 0 ; i < 10; i++){
        pid_t pid = fork();
        if(pid < 0){
            perror("fork");
            exit(1);
        }
        if(!pid){
            //child
            printf("child[%d],self=%d,parent]=%d",i,getpid(),getppid());
        	sleep(1);
            break;//记得break,不然会导致子进程也循环创建进程
         }
    }
	return 0 ;
}

image-20230413140139274

gdb调试多进程

exec函数族

wait和waitpid

进程间通信

标签:fork,void,pid,进程,include,id
From: https://www.cnblogs.com/tldrIKC/p/17315175.html

相关文章

  • (四)多进程的序列化
    给出cloudpickle的GitHub地址:https://github.com/cloudpipe/cloudpickle     =======================================================   单机的Python序列化模块有自带的pickle,但是在Python的分布式计算中进行序列化则是使用cloudpickle。之所以在分布式计......
  • (三)python多进程multiprocessing模块的变量传递问题:父进程中的numpy.array对象隐式序列
    参考:https://docs.python.org/zh-cn/3/library/multiprocessing.htmlcloudpickle——Python分布式序列化的专用模块python多进程multiprocessing模块的变量传递问题:父进程中的numpy.array对象隐式序列化到子进程后的inplace操作的问题-Death_Knight-博客园(cnblogs.com)......
  • ubusd守护进程
    核心部分是ubusd守护进程,它提供了其他守护进程将自己注册以及发送消息的接口。因为这个,接口通过使用Unixsocket来实现,并使用TLV(type-length-value)消息,ubus内部使用Blob_buf,Blob_attr等结构来表示。ubus有两种调用,一个是method调用,一个是notification,其中method包括等待函数返回......
  • java怎么样判断一个进程是否已近结束
    以记事本程序为例Processp=Runtime.getRuntime().exec("notepad.exe");try{p.waitFor();//等待notepad.exe的结束}catch(InterruptedExceptionex){System.err.println("ERROR");System.exit(1);}//继续自己的程序参见http://zhidao.baidu.com/qu......
  • dll正由另一进程使用,因此该进程无法访问此文件
    打开Windows资源监视器:按下Win+R快捷键打开“运行”对话框,输入resmon命令并按下回车键。在资源监视器中,选择“CPU”选项卡,然后在“关联的句柄”列中查找GuiDB.dll文件。您应该能够找到锁定该文件的进程的名称和PID。然后右键关闭。......
  • Linux操作系统进程的状态和转换(五态模型)
    1、进程的状态和装换1.1进程的三态模型按进程在执行过程中的不同情况至少要定义三种状态:运行(running)态:进程占有处理器正在运行的状态。进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态;在多处理机系统中,则有多个进程处于执行状态。就绪(ready)态:进程具......
  • multiprocessing和tqdm配合使用(多进程下载文件进度条显示)
    代码importmultiprocessingasmpimportplatformfromtqdmimporttqdmimportwgetls=['url1','url2','url3']#这里填入实际要下载的urlpbar=tqdm(total=len(ls))pbar.set_description('Sleep')update=lambda*args:pbar.......
  • 多进程下载nadc上的数据
    importwgetfrombs4importBeautifulSoupasbsimportrequestsimportrandomimportrequestsfromtqdmimporttqdmfromconcurrent.futuresimportThreadPoolExecutor,Future,as_completed,waitfrommultiprocessingimportcpu_countheaders=[&#......
  • 进程与线程&并行与并发的概念
    一、进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进......
  • Java并发(一)----进程、线程、并行、并发
    一、进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进......