linux C++ 多进程初步02

ps:疑惑的地方,1 进程pcb的概念, 还有 ulimit -a 显示的信息 是一个进程可以最大占用资源的上限吗? 还有 文件描述符的概念?? 这里不是很明白!记录一下2还有WIFEXITED

  1. 孤儿进程 与僵尸进程
    孤儿进程: 子进程运行,父进程终止, 子进程就是孤儿进程

僵尸进程:进程终止,父进程尚未回收,子进程残留资源(pcb)存放于内核中,变成(Zombie)僵尸进程

  1. wait函数 回收子进程
man wait 看到的是命令提示
man 2 wait 看到的是函数原型
pid_t wait(int *status);
作用:a. 阻塞等待b. 回收子进程资源c. 查看死亡原因  
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);status 传出参数返回值 调用成功:返回终止子进程的pid,调用失败:返回 -1
子进程死亡原因:a. 正常死亡 WIFEXITED如果WIFEXITED为真,使用WEXITSTATUS ,得到退出状态b. 非正常死亡如果WIFSIGNALED为真,使用WTERMSJG, 得到信号

以下是代码示例
在这里插入图片描述
以下是 wait 于 waitpid函数 相关文档介绍

If status is not NULL, wait() and waitpid() store status information in the int to  which  it  points.
This integer can be inspected with the following macros (which take the integer itself as an argument,
not a pointer to it, as is done in wait() and waitpid()!):WIFEXITED(status)returns true if the child terminated normally, that is, by calling exit(3) or _exit(2),  or  byreturning from main().WEXITSTATUS(status)returns  the  exit  status  of the child.  This consists of the least significant 8 bits of thestatus argument that the child specified in a call to exit(3) or _exit(2) or  as  the  argumentfor  a  return  statement  in main().  This macro should be employed only if WIFEXITED returnedtrue.WIFSIGNALED(status)returns true if the child process was terminated by a signal.WTERMSIG(status)returns the number of the signal that caused the child process to terminate.  This macro shouldbe employed only if WIFSIGNALED returned true.

pid_t waitpid(pid_t pid, int *status, int options);pida. <-1 -组idb. -1 回收任意c. 0 回收和调用进程组id相同组内的子进程d. >0 回收指定的pidoptionsa. 0与wait相同,也会阻塞b. WNOHANG 如果没有当前子进程立即退出的,会立刻返回返回值a.如果设置了,WNOHANG,1).如果没有子进程退出,返回02).如果有子进程退出,返回退出的pidb. 失败返回-1(没有子进程)

调用案例
在这里插入图片描述
以下是 pid_t pid 这个参数对应的不同值的介绍
ps: 0 这个参数不明白是什么意思??? 这里记录一下

 < -1   meaning  wait  for  any  child process whose process group ID is equal to the absolute value ofpid.-1     meaning wait for any child process.0      meaning wait for any child process whose process group ID is  equal  to  that  of  the  callingprocess.> 0    meaning wait for the child whose process ID is equal to the value of pid.
  1. 用wait 回收多个子进程 调用案例

在这里插入图片描述

  1. 用waitpid函数回收多个子进程调用案例
#include "stdio.h"
#include "sys/types.h"
#include "sys/wait.h"
#include "stdlib.h"
#include "unistd.h"int main() {int i;int n = 5;pid_t pid;pid_t wpid;for(i=0; i<n; ++i) {pid = fork();if(pid == 0) {break;}}if(i==5) {printf("my is father progress !\n");while(1) {wpid = waitpid(-1, NULL, WNOHANG);if(wpid==-1) {printf("zi ji cheng hui shou wan bi\n");break;} else if (wpid>0) {printf("hui shou de zi jin cheng pid is%d\n", wpid);}}   while(1) {sleep(1);}}if(i<5) {printf("my is son progress! my pid is%d\n", getpid());} return 0;
}
  1. 创建子进程,调用fork之后,在子进程调用自定义程序(段错误,浮点型错误),用waitpid回收,查看退出状态
    代码示例:
#include "stdio.h"
#include "stdlib.h"
#include "sys/types.h"
#include "sys/wait.h"
#include "unistd.h"int main () {pid_t pid;pid_t wpid;int status;pid = fork();if(pid==0) {// zi jin chengexecl("./test3gz.out", "test3gz.out", NULL);} else {while(1) {wpid = waitpid(-1, &status, WNOHANG);if(wpid == -1) {printf("suo you zi jin cheng tui chu\n");break;} else if(wpid>0) {printf("tui chu de zi jin cheng pid shi%d\n", wpid);printf("status is %d\n", status);if(WIFEXITED(status)) {printf("zheng chang tui chu return status is %d\n", WEXITSTATUS(status));}if(WIFSIGNALED(status)) {printf("zi ji cheng kill by signal is %d\n", WTERMSIG(status));}}} while(1) {sleep(1);}}return 0;
}

输出:

a. 当test3gz.out没有发生浮点型错误的时候
this is test3gz.c
k = 3
tui chu de zi jin cheng pid shi18293
status is 0
zheng chang tui chu return status is 0
suo you zi jin cheng tui chu
b. 当test3gz.out发生浮点型错误的时候
tui chu de zi jin cheng pid shi18278
status is 136
zi ji cheng kill by signal is 8
suo you zi jin cheng tui chu
  1. 子进程与父进程共享文件描述符表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程学习笔记《一》什么是软件工程

文章目录软件工程学习笔记目录软件工程过程软件工程方法软件质量软件质量如何评价软件的质量模型ISO9126模型易用性&#xff1a;效率可维护性可移植性为什么内存缓冲区是2048或4096软件工程学习笔记目录 [https://blog.csdn.net/csdn_kou/article/details/83754356] 单纯摆出一…

linux C语言 文件相关知识01

ps:文件描述符表&#xff0c;与文件指针 有什么联系&#xff1f;&#xff1f;&#xff1f; 1. linux 系统&#xff0c;一般一个进程 允许打开的最大文件数量是 1024&#xff0c; 对应内核区的进程控制块&#xff08;pcb&#xff09;中的文件描述符表的范围&#xff0c; 在shell…

软件工程学习笔记《二》代码规范

文章目录软件工程学习笔记目录google代码规范节选python来自google翻译错误注释的示例命名规范import语句的规范import this 源码软件工程学习笔记目录 [https://blog.csdn.net/csdn_kou/article/details/83754356] google代码规范 https://github.com/google/styleguide 节…

PyCharm和git安装教程

文章目录先到官网下载git进入setting&#xff0c;如黄色部分如果你用的是github那么直接setting登陆就行了如果你是gitee的话首先进入setting然后Plugins点击browse查找gitee如图所示&#xff01;最后点击重启ok《不要自己关闭&#xff0c;否则安装失败》安装好了以后,输入你的…

linux 进程通信子mmap

mmap 文件–内存映射 函数原型 #include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);参数介绍&#xff1a; add 传 NULL length 映射区的长度 protPROT_READ 可读PROT_WRITE可写 flagsMAP_SHARED 共享的&#xff0c…

linux信号学习02

未决信号集与阻塞信号集(信号屏蔽字) 阻塞信号集&#xff1a; 将某些信号加入集合&#xff0c;对他们设置屏蔽&#xff0c;当屏蔽x信号后&#xff0c;再收到该信号&#xff0c;该信号的处理将推后(解除屏蔽后) 未决信号集&#xff1a; a. 信号产生&#xff0c;未决信号集中描述…

软件工程学习笔记《三》代码优化和性能测试

文章目录软件工程学习笔记目录如何在开源社区提问&#xff1f;代码审查代码优化运行结果参数解释代码优化原则对常见的数据结构排序算法进行测试关于冒泡排序优化的探讨结果软件工程学习笔记目录 [https://blog.csdn.net/csdn_kou/article/details/83754356] 如何在开源社区提…

linux信号捕捉

信号捕捉&#xff0c;防止进程意外死亡 signal函数 man signal #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);参数介绍&#xff1b; signum 要捕捉的信号 handler 要执行的捕捉函数指针&#xff0c…

软件工程学习笔记《四》需求分析

文章目录软件工程学习笔记《目录》需求工程师当代的需求工程师需要具备的能力当代的需求工程师需要努力的方向当代的需求工程师需要注意的错误需求的定义需求目标需求分析的实质需求分析的关键应该涵盖的内容&#xff1f;需求规约&#xff08;作为较客观的参照&#xff09;单个…

linux守护进程

先了解 linux系统中 会话的概念 会话是进程组的更高一级&#xff0c;多个进程组对应一个会话。 会话是一个或多个进程组的集合 创建一个会话需要注意以下5点事项&#xff1a; a. 调用进程不能是进程组组长&#xff0c; 该进程变成新会话首进程&#xff08;session header&#…

linux 线程学习初步01

线程的概念 进程与线程内核实现 通过函数clone实现的 ps -Lf pidLinux内核线程实现原理 同一个进程下的线程&#xff0c;共享该进程的内存区&#xff0c; 但是只有stack区域不共享。 线程共享资源 a.文件描述符表 b.每种信号的处理方式 c.当前工作目录 d.用户id和组id 线程…

python的文件基本操作和文件指针

读写模式的基本操作 https://www.cnblogs.com/c-x-m/articles/7756498.html r,w,a r只读模式【默认模式&#xff0c;文件必须存在&#xff0c;不存在则抛出异常】w只写模式【不可读&#xff1b;不存在则创建&#xff1b;存在则清空内容】a之追加写模式【不可读&#xff1b;不…

HTTP菜鸟教程速查手册

HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是因特网上应用最为广泛的一种网络传输协议&#xff0c;所有的WWW文件都必须遵守这个标准。 HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;HTML 文件, 图片文件, 查询结果等&am…

mysql学习笔记01-创建数据库

创建数据库&#xff1a; 校验规则&#xff1a;是指表的排序规则和查询时候的规则 utf8_general_ci 支持中文&#xff0c; 且不区分大小写 utf8_bin 支持中文&#xff0c; 区分大小写 比如&#xff1a; create database db3 character set utf8 collate utf8_general_ci; &…

python的Web编程

首先看一下效果 完整代码 import socket from multiprocessing import ProcessHTML_ROOT_DIR ""def handle_client(client_socket):request_data client_socket.recv(1024)print("request data:", request_data)response_start_line "HTTP/1.0 20…

mysql 学习笔记 02创建表

表结构的创建 比如&#xff1a; create table userinfo (id int unsigned comment id号name varchar(60) comment 用户名password char(32),birthday date ) character set utf8 engine MyISAM;comment 表示注释的意思 不同的存储引擎&#xff0c;创建的表的文件不一样

mysql 学习笔记03 常用数据类型

数值类型&#xff1a; a. 整数类型&#xff1a; 注意事项&#xff1a; 举例&#xff1a;某个整型字段 &#xff0c;不为空&#xff0c;且有默认值 create table test (age int unisigned not null default 1);zerofill的使用 b. bit类型的使用 c.小数类型 小数类型占用…

VMware的虚拟机连不上网

1.如果你发现在VMware下运行的虚拟机无法连接网络&#xff0c;那下面的方法也许可以帮 到你。&#xff08;前提是你的物理网络是通的&#xff09; 第一步&#xff1a;在VMware界面下 单击“编辑“→”虚拟网络编辑器” 第二步&#xff1a;单击”更改设置” 获取权限&#xff…

python三国演义人物出场统计

完整代码 开源代码 统计三国演义人物高频次数 #!/usr/bin/env python # codingutf-8 #e10.4CalThreeKingdoms.py import jieba excludes {"来到","人马","领兵","将军","却说","荆州","二人","…