热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

UNIX进程控制2

1.racecondition多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序,这就发生了竞争条件。如果fork之后某种逻辑显式或者隐式依赖于fork之后父进程和子进程的执行顺序(这个顺序不可预知,由内核调度决定),也是racecondition经

 1. race condition

    多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序,这就发生了竞争条件。如果fork之后某种逻辑显式或者隐式依赖于fork之后父进程和子进程的执行顺序(这个顺序不可预知,由内核调度决定),也是race condition经常发生的情形。
    如果一个进程希望等待一个子进程终止,则它必须调用wait函数。如果一个进程要等待其父进程终止,则可使用下列形式的循环:
while(getppid() !=1)
sleep(1);
    这种形式的循环(称为定期询问(polling))的问题是它浪费了C P U时间,因为调用者每隔1秒都被唤醒,然后进行条件测试。
    而通常的的实现是用信号和IPC机制。在子进程中实现TELL_PARENT(),WAIT_PARENT()函数/宏,父进程里实现WAIT_CLILD和TELL_CHILD宏。
 
2. exec
    当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。
    exec, fork,wait和exit都是基本的进程控制原语,后面的popen、system之类的函数是基于这些基本的调用来构造的。
#include
int execl(const char *pathname, const char *arg0, ... /* (char *) 0*/);
int execv(const char *pathname, char *const argv[] );
int execle(const char *pathname, const char *arg0, .../* (char *)0, char *const envp [] */);
int execve(const char *pathname, char *const argv [], char *const envp [] );
int execlp(const char *filename, const char *arg0, ... /* (char *) 0 */);
int execvp(const char *filename, char *const argv [] );
/*六个函数返回:若出错则为-1,若成功则不返回*/
    后两个如果包含/则被认为是一个路径名,否则则是文件名在PATH环境变量中查找相应的可执行文件。这个可执行文件也可以是一个解释器文件(#!)。
    这几个函数中l表示list,v表示向量。list的execl,execle,execlp表示参数的是可变参数列表形式,最后要跟一个空指针表示结束(char *)0
    以e结尾的两个函数(execle和execve)可以传递一个指向环境字符串指针数组的指针。其他四个函数则使用调用进程中的environ变量为新程序复制现存的环境。(如果系统支持putenv和setenv也可以在后面生成的子进程中修改,但不能影响父进程的环境)    
使用/显示当前进程的所有环境变量:
for (char **ptr = environ; *ptr != 0; ptr++)
printf("%s\n", *ptr);
    在执行exec后,进程ID没有改变。除此之外,执行新程序的进程还保持了原进程的下列特征:
• 进程ID和父进程ID。
• 实际用户ID和实际组ID。
• 添加组ID。
• 进程组ID。
• 对话期ID。
• 控制终端。
• 闹钟尚余留的时间。
• 当前工作目录。
• 根目录。
• 文件方式创建屏蔽字。
• 文件锁。
• 进程信号屏蔽。
• 未决信号。
• 资源限制。
• tms_utime, tms_stime, tms_cutime以及tmsustime值。
    对打开文件的处理与每个描述符的exec关闭标志值(FDCLOEXEC)有关。若此标志设置,则在执行exec时关闭该描述符,否则该描述符仍打开。除非特地用f c n t l设置了该标志,否则系统的默认操作是在exec后仍保持这种描述符打开。
 
3. setuid(设置真实的UID)getuid,setreuid,seteuid,setfsuid
#include
int setuid(uid_t uid)
//执行成功则返回0,失败则返回-1,错误代码存于errno。
    setuid()用来重新设置执行目前进程的UID。当有效的UID必须为0(root)时。在Linux下,当root 使用setuid()来变换成参数中的UID时(EUID和UID同时变为参数中的uid_t uid),也就是说,该进程往后将不再具有可setuid()的权利,如果只是向暂时抛弃root权限,稍后想重新取回权限,则必须使用seteuid()。如果是非root用户使用setuid这个函数,它只能用来
    一般在编写具setuid root的程序时,为减少此类程序带来的系统安全风险,在使用完root权限后建议马上执行setuid(getuid());来抛弃root权限。此外,进程uid和euid不一致时Linux系统将不会产生core dump
 
4. system函数:执行一个字符串命令
#include
int system(const char* cmdstring);
在实现中调用了fork,exec和waitpid。
 
5. process accounting
    当取了这种选择项后,每当进程结束时内核就写一个会计记录。典型的会计记录是3 2字节长的二进制数据,包括命令名、所使用的CPU时间总量、用户ID和组ID、起动时间等。
    会计记录所需的各个数据(各C P U时间、传输的字符数等)都由内核保存在进程表中,并在一个新进程被创建时置初值(例如fork之后在子进程中,内核为子进程初始化一个记录,而不是在新程序exec时。所以会计记录对应的是进程而不是程序。)。进程终止时写一个会计记录。这就意味着在会计文件中记录的顺序对应于进程终止的顺序,而不是它们起动的顺序。为了确定起动顺序,需要读全部会计文件,并按起动日历时间进行排序。
#include
#include
 
#define ACCFILE "/var/adm/pacct"
......
struct acct acdata;
......
if ( (fp = fopen(ACCTFILE, "r")) == NULL)
err_sys("can't open file", ACCTFILE);
 
while (fread(&acdata, sizeof(acdata), 1, fp) == 1) {
printf(......acdata.ac_comm...ac.etime)
.......
}
 
6. 获得而用户登陆名,而非用户标志。
#include
char *getlogin(void);
得到了登录名,就可用getpwnam在口令文件中查找相应记录以确定其登录shell等。
 
7. 进程时间
#include
clock_t times(struct tms *buf);
获得一个起始时间和一个终止时间,然后经过static long clktck=0; clktck=sysconf(_SC_CLK_TCK); start_times->tms_utime/(double)clktck。
struct tms {
clock_t tms_utime; /* CPU time */
clock_t tms_stime; /* system CPU time */
clock_t tms_cutime; /* user CPU time, terminated children */
clock_t tms_cstime; /* system CPU time, terminated children */
}
 
textbook:APUE

推荐阅读
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 信息安全等级保护是指对国家秘密信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实 ... [详细]
  • 无线认证设置故障排除方法及注意事项
    本文介绍了解决无线认证设置故障的方法和注意事项,包括检查无线路由器工作状态、关闭手机休眠状态下的网络设置、重启路由器、更改认证类型、恢复出厂设置和手机网络设置等。通过这些方法,可以解决无线认证设置可能出现的问题,确保无线网络正常连接和上网。同时,还提供了一些注意事项,以便用户在进行无线认证设置时能够正确操作。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文详细介绍了相机防抖的设置方法和使用技巧,包括索尼防抖设置、VR和Stabilizer档位的选择、机身菜单设置等。同时解释了相机防抖的原理,包括电子防抖和光学防抖的区别,以及它们对画质细节的影响。此外,还提到了一些运动相机的防抖方法,如大疆的Osmo Action的Rock Steady技术。通过本文,你将更好地理解相机防抖的重要性和使用技巧,提高拍摄体验。 ... [详细]
  • 本文详细介绍了华为4GLTE路由器B310的外置天线安装和设置方法。通过连接电源和网线,输入路由器的IP并登陆设置页面,选择手动设置和手动因特网设置,输入ISP提供商的用户名和密码,并设置MTU值。同时,还介绍了无线加密的设置方法。最后,将外网线连在路由器的WAN口即可使用。 ... [详细]
  • 本文讨论了前端工程化的准备工作,主要包括性能优化、安全防护和监控等方面需要注意的事项。通过系统的答案,帮助前端开发者更好地进行工程化的准备工作,提升网站的性能、安全性和监控能力。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
author-avatar
mobiledu2502881683
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有