进程控制2

本文探讨了进程的优缺点,包括健壮性与内存操作的便利性,以及多任务的开销和进程间通信的复杂性。重点讲解了wait函数族,如wait和waitpid的用法,并剖析了僵尸进程的产生与避免方法,提供了解决方案。
摘要由CSDN通过智能技术生成

进程的优缺点

优点:
对用户来说,操作系统会变得更加健壮(一个进程无法破坏另一个进程或操作系统的运行)
对于开发者来说,更容易进行内存的读取和写入
缺点:
多任务实现开销比较大
编写能够与其他进程通信或者能够对其他进程操作的应用程序将要困难的多


wait函数族

1,wait函数:将当前进程挂起,等待信号来临,再继续运行;用来等待子进程的结束

 pid_t wait(int *wstatus);
       #include <sys/types.h>
       #include <sys/wait.h>
#include <sys/types.h>
#include <sys/wait.h>
#include"stdio.h"
#include"stdlib.h"
#include"unistd.h"

int main()
{
    int i=0;
    int status;
    pid_t pid =fork();
    if (-1 == pid)
    {
	perror("fork error");
	exit(1);
    }
    if( 0 == pid)
    {
	printf("child\n");
	exit(1);
    }
    else
    {
	pid = wait(&status);
	printf("father\n");
    }
}

WEXITSTATUS宏定义:返回子进程的退出状态

2,waitpid:它可以指定等待的进程号

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

#include <sys/types.h>
#include <sys/wait.h>
#include"stdio.h"
#include"stdlib.h"
#include"unistd.h"

int main()
{
    int i=0;
    int status;
    pid_t pid =fork();
    if (-1 == pid)
    {
	perror("fork error");
	exit(1);
    }
    if( 0 == pid)
    {
	printf("child pid=%d\n",getpid());
	exit(5);
    }
    else
    {
	pid = waitpid(pid,&status, 0);
	i=WEXITSTATUS(status);
	printf("father pid= %d,%d\n",pid,i);
    }
}

在这里插入图片描述


僵尸进程的产生

#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/wait.h"
#include "time.h"

int main()
{
	if(!fork())
	{
	    printf("child\n");
	    exit(1);
	}
	sleep(60);
	printf("father\n");
	exit(0);
}

在这里插入图片描述
产生的原因:当进程走完自己的生命周期之后,会执行自己的系统调用exit函数,然后内存被释放,没有执行代码。但是在进程表里仍留下(pid,退出信息),直到父进程将他们回收。
子进程的资源是父进程回收的。


僵尸进程应该尽量避免


避免僵尸进程的方法:在父进程里面调用waitpid,让父进程先死就可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值