系统编程之进程

一、进程相关概述
1、相关指令
ps -aux 查看所有进程
ps -aux|grep 进程 只会过滤出指定进程信息
top 指令类似Windows任务管理器
2、进程描述符 pid
pid = 0 称为交换进程 --进程调度
pid =1 init进程 --系统初始化
二、c程序的存储空间是如何分配的
从高地址到低地址 按如下顺序
命令行参数和环境变量:int main(int argc,char**argv)
栈空间:自定义的函数和其中局部变量
堆空间: malloc和calloc
未初始化的数据:bss段 int a[128];
初始化的数据 :数据段 int a =10;
正文 :代码段
三、fork函数的使用
getpid() 获得当前进程的pid
getppid()获得父进程的pid

#include <stdio.h>
#include <unistd.h>
int main()
{
	pid_t pid1;
	printf("father pid is %d\n",getpid());//与父进程的pid一样,只有父进程跑
 	pid1 = fork();
 	if(pid1 == -1)
 	{
 		perror("fork error");
	}
 	printf("pid is %d\n",getpid());//父子进程都会跑
 	if(pid1==0)//子进程
 	{
  		printf("this child fork pid is %d\n",getpid());
 	}
 	if(pid1>0)//父进程
 	{
  		printf("this father fork pid is %d\n",getpid());
 	} 
 	return 0;
}

四、vfork函数的使用
与fork函数的区别
1、直接使用父进程的存储空间,不拷贝
2、vfork保证子进程先运行,子进程调用exit后,父进程才运行
验证demo

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int cnt = 0;
int main()
{
 	pid_t pid;
 	pid = vfork();
	if(pid==0)
	{	while(1)
  		{
   			printf("this is child fork\n");
   			sleep(1);//防止刷屏
   			cnt++;
   			if(cnt == 3)
   			{
    				exit(0);
 			}
 		}
 	}
 	else if(pid > 0)
 	{
  		while(1)
  		{
   			printf("this is father cnt is %d\n",cnt);
   			sleep(1);
  		}
 	}
 	return 0;
}

五、wait函数
作用:用于等待子进程的退出,回收子进程退出时的状态,子进程状态不被回收就会变成僵尸(zombie)进程(僵死进程)
检查wait 所返回的终止状态的宏:
WIFEXITED(status) 正常终止子进程产生的状态 对于这种情况可使用WEXTSTATUS(status)
WIFSIGNALED(status) 异常终止子进程返回的状态 对于这种情况可使用WTERMSIG(status)
WIFSTOPPEDED(status) 当前暂停子进程返回的状态 对于这种情况可使用WSTOPSIG(status)
WIFCONTINUED(status)

demo验证

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int cnt = 0;
int main()
{
 	pid_t pid;
 	int status;
 	pid = fork();

	if(pid==0)
	{	
		while(1)
  		{
   			printf("this is child fork\n");
   			sleep(1);//防止刷屏
   			cnt++;
   			if(cnt == 3)
   			{
    				exit(3);
 			}
 		}
 	}
	else if(pid > 0)
 	{
  		while(1)
  		{	
  			//原型:pid_t wait(int *status)
  			//wait(NULL);//表示不关心子进程退出的状态
  			wait(&status);
  			printf("status is %d\n",WEXTSTATUS(status));//打印的值为3
   			printf("this is father cnt is %d\n",cnt);
   			sleep(1);
  		}
 	}
 	return 0;
}

waitpid 与 wait 的区别
pid_t waitpid(pid_t pid, int *status, int options);
options 参数会影响 父进程是否阻塞来等待子进程## 标题
六、孤儿进程
父进程如果不等待子进程的退出,在子进程之前就结束了自己的生命,此时子进程就叫做孤儿进程
linux 避免存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值