热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

0725Linux基础进程2

1.fork1.1通过fork创建的父子进程对于fork之前打开的fd,共享文件偏移量。这是因为,父进程fork一个子进程后,会有自己的进

1. fork

  1.1 通过 fork 创建的父子进程对于fork之前打开的fd,共享文件偏移量。这是因为,父进程fork一个子进程后,会有自己的进程表项,因此二者各有一套相同的文件描述符表,他们共享了文件表项,因而也就共享了偏移量。此外,close 的关闭采用的是引用计数,当执行close时,是把该fd 窒息那个的的内核中的文件表现的引用计数减1,仅当引用计数为0 时,才是真正的销毁该结构。

#include
#include
#include
#include
#define ERR_EXIT(m) \do { \perror(m);\exit(EXIT_FAILURE);\}while(0)/** 父子继承共享文件偏移量*/int main(int argc, const char *argv[])
{int fd &#61; open("test.txt", O_RDONLY);if(fd &#61;&#61; -1){ERR_EXIT("open");}pid_t pid;if((pid &#61; fork()) <0){ERR_EXIT("fork");}else if(pid &#61;&#61; 0){char buf[10] &#61; {0};read(fd, buf, 3);printf("in Child buf &#61; %s\n", buf);close(fd); //此处引用计数 减 1}else{sleep(3);char buf[10] &#61; {0};read(fd, buf, 3);printf("in parent buf &#61; %s\n", buf);close(fd);}return 0;
}  

  1.2 目前我们碰到的共享文件偏移量的情况有 2 种&#xff1a;

    a&#xff09;通过dup 等手段复制fd&#xff0c;此时两个fd 共享文件偏移量&#xff08;文件表项&#xff09;&#xff1b;

    b&#xff09;fork 父子进程&#xff0c;二者共享文件偏移量。

  1.3 shell的工作原理&#xff1a;当我们在键盘上敲入”ls”的时候

    a)shell&#xff08;bash、zsh&#xff09;先fork一个子进程

    b)将子进程的代码使用exec替换为“ls”

    c)shell负责该子进程的回收

  1.4 对于经典的fork&#43;exec的组合模式&#xff0c;fork出子进程再进行替换&#xff0c;那么复制完整的子进程的地址空间是无意义的。所以提出两种解决方案&#xff1a;

    a)vfork&#xff1a;vfork的目的就是为了exec&#xff1b;

    b)对于fork采用写时复制技术

  1.5 fork的写时复制技术&#xff1a;

    a)fork子进程时&#xff0c;仅仅复制页表项&#xff0c;而不是具体的进程空间。同时将地址空间设为只读

    b)每当任何一方试图修改地址空间时&#xff0c;就自己复制一份

  1.6 写时复制&#xff08;COW&#xff09;使得父子进程&#xff0c;在物理上共享地址空间的&#xff0c;但是在逻辑上地址空间是相互独立的

2.关于父子进程的处理

  2.1 处理僵尸进程的手段&#xff1a;

    a)处理SIGCHLD信号&#xff1b;

    b)采用wait、waitpid。

  2.2 如果没有任何子进程&#xff0c;那么执行wait时&#xff0c;会立刻返回-1&#xff0c;同时errno为ECHLD。否则阻塞&#xff0c;使用WNOHANG可以避免阻塞。

  2.3 waitpid不是按照顺序回收子进程。

    2.3.1 不按照顺序回收的例子。

#include
#include
#include
#include
#include
#include
#define ERR_EXIT(m) \do { \perror(m);\exit(EXIT_FAILURE);\}while(0)
#define N 10
int main(int argc, const char *argv[])
{int i;pid_t pid;for(i &#61; 0; i 0){//回收所有的子进程if(WIFEXITED(status)){// 判断子进程是否正常退出printf("child %d return success %d\n", pid, WEXITSTATUS(status));}elseprintf("chidl %d return errno\n", pid);}if(errno !&#61; ECHILD){ERR_EXIT("waitpid");}return 0;
}

  

    2.3.2 若要顺序回收&#xff0c;可以用waitpid 一次等待每个特定的pid&#xff0c;若没有等到&#xff0c;会一直阻塞。

#include
#include
#include
#include
#include
#include
#define ERR_EXIT(m) \do { \perror(m);\exit(EXIT_FAILURE);\}while(0)
#define N 10
/** 顺序回收**/
int main(int argc, const char *argv[])
{int i;pid_t pid[N];for(i &#61; 0; i 0){//回收所有的子进程if(WIFEXITED(status)){// 判断子进程是否正常退出printf("child %d return success %d\n", ret, WEXITSTATUS(status));}elseprintf("chidl %d return errno\n", pid[i]);i&#43;&#43;;}if(errno !&#61; ECHILD){ERR_EXIT("waitpid");}return 0;
}

 

  2.4 system与exec区别&#xff1a;

    a)exec替换的是当前进程

    b)system则是创建子进程&#xff0c;然后调用exec替换

    2.4.1 exec的例子。

#include
#include
#include
#include
#include
#define ERR_EXIT(m) \do { \perror(m);\exit(EXIT_FAILURE);\}while(0)int main(int argc, const char *argv[])
{printf("Enter main\n");execlp("ls", "ls", "-l", NULL);//替换当前子进程printf(" Leave main\n");
}

 

    2.4.2 system的例子。

 

#include
#include
#include
#include
#include
#define ERR_EXIT(m) \do { \perror(m);\exit(EXIT_FAILURE);\}while(0)int main(int argc, const char *argv[])
{printf("Enter main\n");system("ls -l");printf(" Leave main\n");
}

  2.5 system的实现&#xff1a;

    a)创建子进程

    b)子进程采用exec进行进程替换

    c)父进程回收子进程&#xff0c;注意EINTR

  2.6 守护进程与普通进程的区别&#xff1a;&#xff08;这个有时间要再看一遍&#xff09;

    a)守护进程不属于shell所在的会话组

    b)当shell退出的时候&#xff0c;守护进程不受影响

 

 

 

 

 

 

 

转:https://www.cnblogs.com/monicalee/p/3868165.html



推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • Linux磁盘的分区、格式化的观察和操作步骤
    本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • Linuxchmod目录权限命令图文详解在Linux文件系统模型中,每个文件都有一组9个权限位用来控制谁能够读写和执行该文件的内容。对于目录来说,执行位的作用是控制能否进入或者通过 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
author-avatar
Steven
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有