Linux系统编程---进程

Linux系统编程—进程

(师承上官可编程)

进程概念

  • 什么是程序,什么是进程?
    程序是静态概念,编译一个c文件,在磁盘中生成pro文件,叫做程序。
    进程就是计算机中的程序关于某数据集合上的一次运行活动,通俗的说进程是正在运行的程序的实例,就相当于程序跑起来了,系统中就多了一个进程。
  • 怎么查看进程?
    1.在Linux里,可以使用ps指令查看:输入ps -aux即可查看全部进程信息,还可以使用grep来查找程序中是否存在某一个进程。例:输入ps -aux|grep init就可以显示出系统中带有init的进程。
    在这里插入图片描述
    2.还可以使用top指令来查看,类似于Windows的资源管理器
    在这里插入图片描述
  • 进程标识符
    每个进程都有一个非负整数表示的唯一ID,叫做pid
    用getpid()函数可以获取自身的标识符
printf("pid= %d",getpid());
  • 父子进程
    进程A创建了进程B,那么A叫做父进程,B叫做子进程,父子进程是相对的概念,理解为人类中的父子关系。

创建进程

  1. 使用fork函数创建一个进程

需要包含的头文件

#include<unistd.h>

函数原型:

pid_t fork(void);

我们可以使用fork()函数创建一个子进程,fork函数调用成功,返回两次,
返回值为0,代表当前进程是子进程
返回值为非负数,代表当前进程是父进程
调用失败,返回-1

进程中,父子进程的pid也是不同的,可以通过代码把当父子进程的pid打印出来

pid_t retpid;
retpid = fork();
if(retpid > 0)
{
	printf("this is Parent process! pid=%d\n",getpid());
}else if (retpid == 0)
{
	printf("this is child process! pid=%d\n",getpid());
}

运行结果:
在这里插入图片描述注:fork函数创建的子进程使用的存储空间是拷贝父进程的存储空间的。
2. vfork()函数
vfork函数也可以创建进程,与fork函数的区别:
1、vfork直接使用父进程存储空间,不拷贝。
2、vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行
可以用下面的代码来验证
在这里插入图片描述

该代码使用vfork函数创建了子进程,运行3次子进程并打印pid,然后退出子进程父进程再继续运行,运行结果如下:
在这里插入图片描述

进程退出

进程退出分为正常退出和异常退出
正常退出:
1、main函数调用return
2、进程调用exit(),属于标准c库
3、进程调用_exit()或_Exit(),属于Linux系统调用
异常退出:
1、调用abort
2、当进程收到某些信号时,如ctrl+c
3、最后一个线程对取消(cancellation)请求做出回应

函数原型:

void exit(int status);

如上一份代码里就包含exit函数:exit(-1),这种属于正常退出

等待子进程

僵死进程
父进程等待子进程退出,并收集子进程的退出状态,如果子进程退出状态不被收集,会变成僵死进程(僵尸进程)

孤儿进程

父进程如果不等待子进程退出,在子进程结束之前就结束了自己的“生命”,此时子进程叫做孤儿进程,Linux避免系统存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值