进程控制

一、进程

1、什么是进程:运行起来的进程。进程是一个具有一定独立功能的程序的一次运行活动
进程是一个程序正在执行的实例。每个这样的实例都有自己的地址空间和执行状态。
2、怎么区分进程:给每个进程分进程号pid。每个进程都有一个ID(ID是一个正整数),唯一标识了系统中的这个进程。
每个进程都有一个创建它的进程,叫父进程(Parent Process)
进程ID(PID):标识进程的唯一数字
父进程ID(PPID)
启动进程的用户ID(UID)
3、pstree命令:查看进程树
4、ps -ef:在终端上看任务管理器
使用getpid和getppid查看进程号
getpid:查看本进程的进程号
geptpid:查看父进程的进程号

#include <stdio.h>

int main()
{
	
	printf("本进程id = %d\n",getpid());
	printf("父进程id = %d\n",getppid());
	
	while(1);
	
	return 0;
}

5、进程的特点:
(1)动态性
(2)并发性
(3)独立性
(4)异步性
(5)结构特征
6、进程同步
一组并发进程按一定的顺序执行的过程称为进程间的同步。
具有同步关系的一组并发进程称为合作进程,合作进程间互相发送的信号称为消息或事件。
7、进程死锁:多个进程因竞争资源而形成一种僵局,若无外力作用,这些进程都将永远不能再向前推进。
8、创建子进程
使用fork函数
#include <unistd.h>
pid_t fork(void)
功能:创建子进程
fork的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值:
1、在父进程中,fork返回新创建的子进程的PID;
2、在子进程中,fork返回0;
3、如果出现错误,fork返回一个负值
9、进程的终止
exit,_exit用于终止进程
区别:
_exit: 直接使进程停止,清除其使用的内存,并清除缓冲区中内容
exit与 _exit的区别:在停止进程之前,要检查文件的打开情况,并把文件缓冲区中的内容写回文件才停止进程。
10、僵尸进程
僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸。
形成的例子

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>


//僵尸
int main()
{
	
	int i;
	for(i = 0;i < 10;i++)
	{
		pid_t pid = fork();
		if(0 == pid)
			exit(0);
	}
	
	while(1);
	return 0;
}

11、父进程先退出的结果
若父进程比子进程先终止,则该父进程的所有子进程的父进程都改变为init进程。我们称这些进程由init进程领养。其执行顺序大致如下:在一个进程终止时,内核逐个检查所有活动进程,以判断它是否是正要终止的进程的子进程,如果是,则该进程的父进程ID就更改为1(init进程的ID);
例子

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
	FILE *fp = fopen("tmp.txt","w");
	if(NULL == fp)
	{
		perror("打开文件失败");
		return -1;
	}
	pid_t pid = fork();
	
	if(pid > 0)
	{
		exit(0);
	}
	while(1)
	{
		fputs("hello",fp);
		fflush(fp);
		sleep(1);
	}
	
	return 0;
}

12、进程等待wait和waitpid
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
返回值:若成功返回进程ID,若出错返回-1。

调用wait或waitpid的进程可能发生的情况有:

如果所有子进程都还在运行,则阻塞(Block)。
如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。
如果它没有任何子进程,则立即出错返回。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>


int main()
{
	
	int i; 
	pid_t pid;
	for(i = 0;i < 10;i++)
	{
		pid = fork();
		if(0 == pid)
			break;
	}  
	
	while(1)
	{
		if(pid > 0)
		{
			pid_t id = wait(NULL);
			printf("死亡的子进程,id = %d\n",id);
			if(id < 0)
				break;
		}
	}
	if(0 == pid)
	{
		while(1);
	}
	
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值