day08

回忆昨天内容:
一、文件夹的操作
opendir(3)、closedir(3)、readdir(3)

二、文件重定向实现的原理
dup(2) dup2(2)

三、文件锁
fcntl(2)
四、库函数和系统调用之间的关系
五、杂项
六、进程的基础
fork(2)

补充:
如何查看进程的相关信息?
ps -aux

今天内容:
一、进程的退出
1、return和exit(3)的区别
return只是函数的返回
exit(3)是进程的结束
#include <stdlib.h>
void exit(int status);
功能:终止进程
参数:
status:退出状态码。status&0377的值给父进程。
返回值:
永远不返回。

代码参见test.c

在进程结束前,调用一些函数。需要将这些函数注册给进程。
on_exit(3)
#include <stdlib.h>
int on_exit(void (*function)(int , void *), void *arg);
功能:注册一个函数给进程,在进程终止的时候调用该函数
参数:
function:指定退出函数的名字
void (*function)(int , void *)
arg:指定退出函数的第二个参数
返回值:
0    成功
非0   错误

举例验证on_exit(3)的使用
代码参见 on_exit.c

atexit(3)
#include <stdlib.h>
int atexit(void (*function)(void));
功能:注册一个函数给进程,在进程终止的时候调用该函数
参数:
function:指定了要注册的函数的名字
返回值:
0    成功
非0   错误
举例验证,atexit函数的使用。
代码参见  atexit.c

_exit(2)
#include <unistd.h>
void _exit(int status);
功能:终止当前进程
参数:
status:退出状态码
返回值:
永远不返回。

二、进程资源的回收
在进程退出以后,父进程会回收子进程的资源。
使用wait(2)、waitpid(2)系统调用回收子进程的资源。
如果父进程早于子进程结束,那么父进程的子进程的父亲就是init进程。这种进程称为孤儿进程。
举例验证  孤儿进程
代码参见  lonely.c

#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
功能:等待进程改变状态。
参数:
status:退出状态码的地址。子进程的退出状态存放在这块地址空间里。可以使用一些宏检测退出原因。
WIFEXITED(status)  如果正常死亡,返回真
WEXITSTATUS(status)  返回子进程的退出状态和0377的与,那个值。
WIFSIGNALED(status) 如果子进程被信号终止,返回真
WTERMSIG(status)  检测被几号信号终止。只有上个宏为真的时候,才使用。




返回值:
-1   错误
返回终止的子进程的pid

举例验证,父进程等待子进程的结束,并且回收子进程的资源。
代码参见  wait.c

pid_t waitpid(pid_t  pid,int *status,int options);
功能:等待进程改变状态。
参数:
pid:
< -1: pid取绝对值,如果子进程的组id等于这个绝对值,那么这个子进程就被等待。
-1:等待任意子进程
0:等待和当前进程有同一个组id的子进程
> 0   等待子进程的pid是pid参数的子进程。
status:同wait(2)参数的使用
options:
WNOHANG:非阻塞回收。
0    阻塞回收
返回值:
-1   错误  
0   没有子进程退出
回收的子进程的pid

举例验证waitpid的使用
代码参见waitpid.c

补充:
1、同步  异步
事情A和事情B,如果必须先执行完事情A,然后再执行事情B,那么说这两件事情同步

如果两件事情的执行先后不确定,那么是异步。



2、给指定进程发送信号
kill -信号编号  进程的pid

3、子进程已经终止,但是父进程还没有回收子进程的资源,这时候,子进程处于僵尸状态,称为僵尸进程。

举例僵尸进程。代码参见 zombile.c

三、在进程的虚拟地址空间里加载新的映像(image)
在子进程的虚拟地址空间里加载新的影像,需要使用系统提供的一个家族的函数。
execl(3)
#include <unistd.h>
extern char **environ;
int execl(const char *path,  const  char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const  char *arg,\
              ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const   char  *file,  char *const argv[],
                  char *const envp[]);

execve(2)
#include <unistd.h>
int  execve(const  char  *filename, char *const argv[],\
                  char *const envp[]);
相同的exec
l list   
v vector
p PATH    
e 环境变量
返回值:
成功调用永远不返回
-1  错误   errno被设置
举例验证  在子进程的虚拟地址空间加载新的映像
代码参见  exec.c

day08$ps -o pid,ppid,pgrp,comm
  PID  PPID  PGRP COMMAND
 8725  8714  8725 bash
 9652  8725  9652 ps


补充:
ls -l filename  
char *const ps_argv[]={"ls","-l","filename",NULL};

bash调用fork产生子进程,在子进程地址空间里加载新的映像
 execvp(ps_argv[0],ps_argv);

ps -o pid,ppid,pgrp,comm
char *const ps_argv[]={"ps","-o",\
"pid,ppid,pgrp,comm",NULL};
bash调用fork产生子进程,在子进程地址空间里加载新的映像
 execvp(ps_argv[0],ps_argv);

bash有外部命令和内部命令构成
外部命令和bash不是同一个可执行程序。
内部命令是bash本身的一部分。

如何察看一个命令是内部命令还是外部命令?
type 命令

四、使用system(3)启动新的可执行程序
#include <stdlib.h>
int system(const char *command);
功能:执行一个shell命令
参数:
command:可执行命令
返回值:
-1  错误
返回command的退出状态码。
举例验证 system(3)的使用
代码参见  system.c

system和exec系列函数的区别
bash───a.out───a.out───sh───myt
bash───a.out───myt

总结:
一、进程的退出
二、进程资源的回收
三、加载新的映像
四、使用system(3)调用新的可执行程序

作业:
编写代码使用fork建立进程树。
内容概要:本文档提供了关于“微型车间生产线的设计与生产数据采集试验研究”的毕业设计复现代码,涵盖从论文结构生成、机械结构设计、PLC控制系统设计、生产数据采集与分析系统、有限元分析、进度管理、文献管理和论文排版系统的完整实现。通过Python代码和API调用,详细展示了各个模块的功能实现和相互协作。例如,利用SolidWorks API设计机械结构,通过PLC控制系统模拟生产流程,使用数据分析工具进行生产数据的采集和异常检测,以及利用进度管理系统规划项目时间表。 适合人群:具有机械工程、自动化控制或计算机编程基础的学生或研究人员,尤其是从事智能制造领域相关工作的人员。 使用场景及目标:①帮助学生或研究人员快速搭建和理解微型车间生产线的设计与实现;②提供完整的代码框架,便于修改和扩展以适应不同的应用场景;③作为教学或科研项目的参考资料,用于学习和研究智能制造技术。 阅读建议:此资源不仅包含详细的代码实现,还涉及多个学科领域的知识,如机械设计、电气控制、数据分析等。因此,在学习过程中,建议读者结合实际操作,逐步理解每个模块的功能和原理,并尝试调整参数以观察不同设置下的系统表现。同时,可以参考提供的文献资料,深入研究相关理论和技术背景。
本次的学生体质健康信息管理网站,按照用户的角色可以分为教师与学生,后台设置管理员角色来对学生的信息进行管理。,设计如下: 1、后台管理系统 后台管理系统主要是为该系统的管理员提供信息管理服务的系统,具体包括的功能模块如下: (1)管理员信息管理 (2)教师信息管理 (3)学生信息管理 (4)健康信息统计(图形化进行健康,亚健康等学生的信息数量统计) 2、教师角色的功能模块设计 教师角色所需要的功能模块主要包括了如下的一些内容: (1)个人资料修改 (2)学生体质健康管理:录入相关数据,包括但不限于身高、体重、肺活量、视力等生理指标以及运动能力、身体成分、骨密度等健康指标,并且设置健康,亚健康状态 (3)学生健康建议:根据体质信息,进行学生健康的建议 (4)健康预警:对健康出问题的学生,进行健康预警 (5)饮食和锻炼情况管理,查看 3、学生角色 学生角色可以通过该信息网站看到个人的基本信息,能够看到教师给与学生的健康建议等,功能模块设计如下: (1)个人资料修改 (2)我的健康建议查看 (3)我的健康预警 (4)饮食和锻炼情况管理,记录平时的饮食和锻炼情况 完整前后端源码,部署后可正常运行! 环境说明 开发语言:Java后端 框架:ssm,mybatis JDK版本:JDK1.8+ 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:eclipse/idea Maven包:Maven3.3+ 部署容器:tomcat7.5+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值