Linux 下用vfork()创建进程,子进程用return和exit返回的区别

1 #include <stdio.h>

2 #include <unistd.h>

3 #include <sys/types.h>

4 #include <error.h>

5

6 int main()

7 {

8     pid_t id=vfork();

9     if(id==29){//child

10         printf("child:hello world\n");

11         //exit(0);

12         return 0;

13     }else if(id<0){

14         perror("vfork");

15         exit(1);

16     }else{//father

17         printf("father:hello bit\n");

18     }

19     return 0;

20 }

exit运行结果为:

child:hello world

father:hello bit

return运行结果为:

child:hello world

father:hello bit

child:hello world

father:hello bit

child:hello world

father:hello bit

child:hello world

father:hello bit

child:hello world

father:hello bit

child:hello world

father:hello bit

child:hello world

father:hello bit

child:hello world

father:hello bit

child:hello world

father:hello bit

child:hello world

father:hello bit

child:hello world

father:hello bit

vfork: Resource temporarily unavailable

运行结果分析:

vfork 时父子进程共享数据段,fork时进行拷贝,如果,vfork子进程中使用return返回,则会出现段错误  。

vfork后父子进程是共用一个栈的。内核会让父进程暂时挂起,等子进程退出后在执行(或者释放其所使用的地址空间,比如调用exec函数)。子进程从vfork中return,调用栈就给破坏了,等子进程退出,父进程在运行时,就会出错误了。

时间: 2024-10-23 09:44:41

Linux 下用vfork()创建进程,子进程用return和exit返回的区别的相关文章

ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识)

原文:ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识) 前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或者 macOs 中部署的 dotnet 程序创建一个守护进程,来保证我们的程序在异常或者是电脑重启的时候仍然能够正常访问. 如果你以后用准备使用 asp.net core来开发项目的话,程序并且部署到 Linux 上的话,那么此篇文章你值得收藏. 如果你觉得对你有帮助的话

Linux下的LVM创建以及Linux快照卷

通过最的学习,我加深了对LVM的理解,在这里,我将它写成博客,一是方便自己记忆,二是让Linux的入门学习者一起学习一下. 首先我们引入LVM的概念,并展开详细的说明,主要是近期学习的看法,我们先看一个图 我们将会提到的名词有:PV.VG.LV.PE 在图中,最下面的,我们可以理解为物理存储介质,硬盘或是分区 PV:称为物理卷,是LVM的基本存储块. VG:称为卷组,我们可以看卷组是由物理卷组合而成的. LV:称为逻辑卷,是从卷组中划分出来的. PE:physical extent,我就称为物理

win/linux 下使用 psutil 获取进程 CPU / memory / IO 占用信息

psutil - A cross-platform process and system utilities module for Python 1. 安装 pip 安装即可. windows 下需要安装 vs2008,否则报错: Unable to find vcvarsall.bat 如果已经安装 vs2010 / vs2012 则需要设置环境变量,VS90COMNTOOLS 指向已有的 vs 变量. vs2010 设置如下: VS90COMNTOOLS = %VS100COMNTOOLS%

在Linux下给mysql创建用户并分配权限等问题

在linux系统中安装mysql的步骤 工具: mysql-5.6.17-linux-glibc2.5-i686.tar.gz mysql-5.6.17-linux-glibc2.5-x86_64.tar.gz linux系统64位 方法/步骤 1.到mysql官网下载mysql编译好的二进制安装包. 2.解压安装包: 3.进入安装包所在目录,执行命令:tar -zxvf  mysql-5.6.17-linux-glibc2.5-i686.tar.gz 4.复制解压后的mysql目录到系统的本地

Linux下的目录创建命令使用实践

[文章摘要] 本文以实际的C源程序为例子,介绍了Linux下的目录创建命令(mkdir)的使用方法,为相关开发工作的开展提供了有益的参考. [关键词] C语言  Linux  目录创建  makefile  开发 一.mkdir命令简介 mkdir命令用来创建指定名称的目录,其命令格式为:mkdir [选项] 目录... 其中,[选项]可以是"-m"."-p"或"-v".此外,目录名是区分大小写的. 二.本程序流程 本文中的程序用于实现创建目录的

Linux下取代top的进程管理工具 htop

一.htop 简介 This is htop, an interactive process viewer for Linux. It is a text-mode application (for console or X terminals) and requires ncurses. Comparison between htop and top In 'htop' you can scroll the list vertically and horizontally to see all

Linux下查看某一进程所占用内存的方法

Linux下查看某一个进程所占用的内存,首先可以通过ps命令找到进程id,比如 ps -ef | grep kafka 可以看到kafka这个程序的进程id 可以看到是2913,现在可以使用如下命令查看内存: top -p 2913 这样可以动态实时的看到CPU和内存的占用率,然后按q键回到命令行 也可直接使用ps命令查看: ps -aux | grep kafka 第一个标注的地方是CPU和内存占用率,后面的943100是物理内存使用量,单位是k,此时kafka大约占用943M内存 还可以查看

Linux下一个简单守护进程的实现 (Daemon)

在Linux/UNIX系统引导的时候会开启很多服务,这些服务称为守护进程(也叫Daemon进程).守护进程是脱离于控制终端并且在后台周期性地执行某种任务或等待处理某些事件的进程,脱离终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的中断信息所终止. 创建守护进程的一般步骤: (1) 创建子进程,退出父进程 为了脱离控制终端需要退出父进程,之后的工作都由子进程完成.在Linux中父进程先于子进程退出会造成子进程成为孤儿进程,而每当系统发现一个孤儿进程时,就会自动由

浅谈Linux下的syslog守护进程

syslog是Linux下默认的日志守护进程.任何希望生成日志信息的程序都可以通过syslog 接口实现该目的. 同时,几乎所有的网络设备都可以通过syslog协议,将日志信息以UDP的形式传送给远端服务器,远端接收日志服务器必须通过syslogd监听UDP端口514,并根据 syslog.conf 配置文件张的配置处理.配置文件 /etc/rsyslog.conf 中规定了syslogd如何根据设备和信息的重要级别来报告信息. 这里只需要有个大致了解即可,下面都会提到这些东西. 关于配置文件: