linux入门到精通-第十章-进程和程序(2)

linux入门到精通-第十章-进程和程序(2)

目录

参考

等待子进程退出函数

概述

在每个进程退出的时候,内核释放该进程所有的资源、包括打开的文件、占用的内存等。但是仍然为其保留一定的信息,这些信息主要指进程控制块PCB的信息 (包括进程号、退出状态、运行时间等)。父进程可以通过调用wait或waitpid得到它的退出状态,同时彻底清除掉这个进程。wait() 和 waitpid() 函数的功能一样,区别在于wait() 函数会阻塞,waitpid()可以设置不阻塞,waitpid()还可以指定等待哪个子进程结束。

注意:一次wait或waitpid调用只能清理一个子程,清理多个子进程应使用循环

wait函数

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
功能:
	等待任意一个子进程结束,如果任意一个子进程结束了,此函数会回收该子进程的资源.
参数:
	status : 进程退出时的状态信息
返回值:
	成功:已经结束子进程的进程号
	失败:-1

调用 wait()函数的进程会挂起(阻塞),直到它的一个子进程退出或收到一个不能被忽视的信号时才被唤醒(相当于继续往下执行)。若调用进程没有子进程,该函数立即返回;若它的子进程已经结束,该函数同样会立即返回,并且会回收那个早已结束进程的资源。所以,wait0)函数的主要功能为回收已经结束子进程的资源。如果参数 status 的值不是 NULL,wait() 就会把进程退出时的状态取出并存入其中,这是一个整数值(int),指出了子进程是正常退出还是被非正常结束。这个退出信息在一个 int 中包含了多个字段,直使用这个值是没有意义的,我们需要用宏定义取出其中的每个字段。

宏函数可分为如下三组:

宏函数可分为如下三组

  1. WIFEXITED(status) 为非0一进程正常结束 WEXITSTATUS(status) 如上宏为真,使用此宏 一>获取进程退出状态 (exit的参数)

  2. WIFSIGNALED(status) 为非0 一>进程异常终止 WTERMSIG(status) 如上宏为真,使用此宏 一>取得使进程终止的那个信号的编号

  3. WIFSTOPPED(status) 为非0 一>进程处于暂停状态 WSTOPSIG(status) 如上宏为真,使用此宏 一>取得使进程暂停的那个信号的编号 WIFCONTINUED(status) 为真 一>进程暂停后已经继续运行

示例

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

//区分父子进程
int main(void)
{
   
	int ret = -1;
	int status = 0;
	pid_t pid =-1;
	//创建一个子进程在父进程中返回子进程的pid
	//fork函数在子进程中返回0
	pid = fork();
	if(pid <0)
	{
   
		// 没有创建成功
		perror("fork");
		return 0;

	}
	if (0 == pid)
	{
   
		//子进程
		for(int i = 0; i <5;i++)
		{
   
			printf("child proces [%d] do thing %d \n", getpid(),i+1);
			sleep(1);
		}
		// 子进程终止
		exit(10);
	}
	//父进程
	printf("父进程等待子进程退出,回收其资源\n");
	ret = wait(&status);
	if( -1 == ret ) {
   
		perror("wait");
		return 1;
	}
	printf("父进程回收了子进程资源, status=%d\n",status);
	//属于正常退出
	if (WIFEXITED(status))
	{
   
		printf("子进程退出状态码: %d\n",WEXITSTATUS(status));
	}
	else

Read more

超快速,使用ChatGPT编写回归和分类算法

超快速,使用ChatGPT编写回归和分类算法

本文将使用一些 ChatGPT 提示,这些提示对于数据科学家在工作时非常重要。 微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩 以下是一些示例ChatGPT 提示的列表以及数据科学家的响应。 ChatGPT 提示 为决策树回归算法生成 python 代码。 下面是使用scikit-learn在 Python 中进行决策树回归的示例代码: import numpy as np import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeRegressor # Generate random data rng = np.random.default_rng() x = 5 * rng.random(100) y = np.sin(x) + 0.

By Ne0inhk
力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

993.二叉树的堂兄弟节点 难度:简单 题目: 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。 我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。 只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。 示例: 示例 1: 输入:root = [1,2,3,4], x = 4, y = 3 输出:false

By Ne0inhk
1239.串联字符串的最大长度 关于字符串的回溯算法!

1239.串联字符串的最大长度 关于字符串的回溯算法!

题目: 给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串, 如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。 请返回所有可行解 s 中最长长度。 提示: 1 <= arr.length <= 16 1 <= arr[i].length <= 26 arr[i] 中只含有小写英文字母 示例: 示例 1: 输入:arr = ["un","iq","ue"] 输出:4 解释:所有可能的串联组合是

By Ne0inhk