Linux系统编程36 进程控制 - 进程的消亡及释放资源 wait()/waitpid()

上一节说道,父进程需要处理子进程结束后的善后工作,怎么善后呢? 就是 wait() / waitpid()

这里只是简单的使用 wait()

waitpid()以及各个判断终止状态宏的使用 还需要研究


NAME
wait, waitpid, waitid - wait for process to change state 等待进程更改状态

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

   pid_t wait(int *status);

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

   int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);

RETURN VALUE
wait(): on success, returns the process ID of the terminated child; on error, -1 is returned.
成功返回 终止的子进程 的 进程ID ,失败返回-1

在这里插入图片描述
wait 使用:

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

#define LEFT 200
#define RIGHT 250

int main(void)
{
	int i,j,mark;
	pid_t pid;
	
	for(i = LEFT; i <= RIGHT; i++)
	{
		pid = fork();
		if(pid < 0)
		{
			fprintf(stderr,"fork() failed!\n");
			exit(1);
		}
		else if(pid == 0)//child
		{
			mark = 1;
			for(j = 2; j < i/2; j++)
			{
				if(i % j ==0)
					{
						mark = 0;
						break;
					}
			
			}

			if(mark)
				printf("%d is a primer\n",i);

			exit(0);//!!!
		}
		
	}
	sleep(1000);
	exit(0);
}

此时 201个子进程 是僵死进程 父进程为init

在这里插入图片描述

添加 wait() 善后处理后:

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

#define LEFT 200
#define RIGHT 250

int main(void)
{
	int i,j,mark;
	pid_t pid;
	
	for(i = LEFT; i <= RIGHT; i++)
	{
		pid = fork();
		if(pid < 0)
		{
			fprintf(stderr,"fork() failed!\n");
			exit(1);
		}
		else if(pid == 0)//child
		{
			mark = 1;
			for(j = 2; j < i/2; j++)
			{
				if(i % j ==0)
					{
						mark = 0;
						break;
					}
			
			}

			if(mark)
				printf("%d is a primer\n",i);

			exit(0);//!!!
		}
		
	}

	for(i = LEFT;i <= 250; i++)
		wait(NULL);

	sleep(1000);
	exit(0);
}

此时 ps axf 就没有了 变成僵死进程的子进程,只剩下一个父进程了。

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/113795396
今日推荐