Linux系统编程之进程

文章介绍了进程的基本概念,包括程序与进程的区别,查看系统进程的方法,以及进程标识符PID。讨论了父进程与子进程的关系,C程序的存储空间分配,并详细阐述了创建进程的fork和vfork函数。此外,还涉及了进程的退出方式,包括正常和异常退出,以及等待子进程退出的wait和waitpid函数。孤儿进程的情况也有所提及,即当父进程先于子进程结束时,init进程会接管孤儿进程。
摘要由CSDN通过智能技术生成

1.进程基本概念

1、什么是程序?什么是进程?有什么区别?

程序是静态的概念,gcc xxx.c –o pro,磁盘中生成pro文件,叫做程序

进程是程序的一次运行活动,通俗点意思是程序跑起来了,系统中就多了一个进程

2、如何查看系统中有哪些进程?

a.使用ps指令查看,实际工作中,配合grep来查找程序中是否存在某一个进程

ps -aux|grep init

b.使用top指令查看,类似windows任务管理器工作中,配合grep来查找程序中是否存在某一个进程

3、什么是进程标识符?

每个进程都有一个非负整数。表示的唯一ID,叫做pid,类似身份证。

pid:进程标识符:非负整数

pid=0:交换进程,作用:进程调度;

pid=1:init进程,作用:系统初始化

编程调用getpid()函数获取自身的进程标识符

getppid()获取父进程的进程标识符。

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

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

4、父进程和子进程

进程A创建了进程B

那么A叫做父进程,B叫做子进程,父子进程是相对的概念,理解为人类中的父子关系。

5、C程序的存储空间是如何分配的?

 

简单来说:

高地址:   命令行参数和环境变量

栈:函数调用,局部变量,函数调用产生的信息都放在栈里面

堆:malloc在堆里申请空间

Bss段:函数外未初始化的数据

数据段:初始化的数据

代码段:正文段

2.创建进程

fork():

 #include <sys/types.h>

 #include <unistd.h>

 pid_t fork(void);

返回0,代表子进程;

返回子进程pid,代表父进程

失败,返回-1;

写实拷贝:代码段共享,数据段发生改变时再拷贝。

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


int main()
{
	pid_t pid;
	int data = 10;



	printf("father: id=%d\n",getpid());

	pid = fork();
		
	if(pid > 0)
	{
		printf("this is father print, pid = %d\n",getpid());
		
	}
	
	else if(pid == 0){
		printf("this is child print,child pid = %d\n",getpid());

		data = data+100;
	}
	


	printf("data=%d\n",data);
	return 0;
}

创建子进程的目的:

 vfork():

  #include <unistd.h>
  pid_t vfork(void);

返回0,代表子进程

返回子进程pid,代表父进程

跟fork()的区别:

  1. vfork直接使用父进程存储空间,不拷贝
  2. vfork保证子进程先运行,当子进程调用exit退出后,父进程才开始执行。

3.进程退出 

正常退出:

1.Main函数调用return
2.进程调用exit(),标准c库
3.进程调用_exit()或者_Exit(),属于系统调用
4.进程最后一个线程返回
5.最后一个线程调用pthread_exit

异常退出:

1.调用abort
2.当进程收到某些信号时,如ctrl+C
3.最后一个线程对取消(cancellation)请求做出响应

 

4.等待子进程退出

父进程等待子进程退出,并收集子进程的退出状态

子进程退出状态不被收集,变成僵死进程(僵尸进程) 

 

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *wstatus);
pid_t waitpid(pid_t pid, int *wstatus, int options);

 wait:使调用者阻塞,waitpid:有一个选项,可以使调用者不阻塞。

status参数:是一个整型数指针

非空:子进程退出状态放在它所指向的地址中。

空:不关心退出状态

 

 孤儿进程:父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”,此时子进程叫做孤儿进程。

Linux避免系统存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值