关于fork&exec之进程的创建和可执行程序的加载过程

告别VBA!用Python+PyWin32自动化你的SolidWorks建模流程(附完整代码) 本文详细介绍了如何利用PythonPyWin32实现SolidWorks建模流程的自动化,替代传统的VBA宏开发。通过环境配置、宏代码转换、高级开发模式及工程化实践等实战内容,帮助机械设计师构建高效、可维护的自动化工作流,显著提升设计效率。 阅读详情

中科大SA***243-石润成

一、预备阶段

实验环境:Ubuntu10.04

分析内核版本:Linux-2.6.11

1.编写一个fork和exec程序

myfork.c

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
    pid_t pid;
    pid = fork();
    if(0 == pid)
    {
        execl("./son","son",NULL);
    }
    else
        if(pid > 0)
        {
            execl("./parent","parent",NULL);
        }
        else
        {
            fprintf(stderr, "fork failure!\n");
            return -1;
        }
    return 0;
}
myparent.c

#include<stdio.h>
int main()
{
    printf("I am parent process!\n");
    return 0;
}
myson.c

#include<stdio.h>
int main()
{
    printf("I am son process!\n");
    return 0;
}
各自生成myfork、myparent、myson的ELF格式文件。

打印结果:

I am parent process!
I am son process!

二、分析fork系统调用在内核中的执行过程

1)关于系统调用fork()、vfork()、clone()

    系统调用__clone()的主要用途是创建一个线程,这个线程可以使内核线程,也可以是用户线程。创建用户空间线程是,可以给定线程用户空间堆栈的位置,还可以指定子进程运行的起点。同时还可以用__clone()创建进程,有选择地复制父进程的资源。而fork(),则是全面地复制。还有一个系统调用vfork(),其作用也是创建一个线程,但主要只是作为创建进程的中间步骤,目的在于提高创建时的效率,减少系统开销,其设计接口与fork相同。这几个系统调用的代码在arch/i386/kernel/process.c中。 

asmlinkage int sys_fork(struct pt_regs regs)
{
	return do_fork(SIGCHLD, regs.esp, ®s, 0, NULL, NULL);
}

asmlinkage int sys_clone(struct pt_regs regs)
{
	unsigned long clone_flags;
	unsigned long newsp;
	int __user *parent_tidptr, *child_tidptr;

	clone_flags = regs.ebx;
	newsp = regs.ecx;
	parent_tidptr = (int __user *)regs.edx;
	child_tidptr = (int __user *)regs.edi;
	if (!newsp)
		newsp = regs.esp;
	return do_fork(clone_flags, newsp, ®s, 0, parent_tidptr, child_tidptr);
}

/*
 * This is trivial, and on the face of it looks like it
 * could equally well be done in user mode.
 *
 * Not so, for quite unobvious reasons - register pressure.
 * In user mode vfork() cannot have a stack frame, and if
 * done by calling the "clone()" system call directly, you
 * do not have enough call-clobbered registers to hold all
 * the information you need.
 */
asmlinkage int sys_vfork(struct pt_regs regs)
{
	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.esp, ®s, 0, NULL, NULL);
}
    可以看出,三个系统调用的实现都是通过do_fork来实现的,只是对do_fork()调用的参数不同。

2)下面分析fork()开始系统调用的

    当从用户态调用fork()函数进入系统调用时,CPU切换到内核态并开始执行一个内核函数,详情请见这里,这里笔者简单用个图来描述一下。

关键之处:

        fork调用调用0x80中断,寄存器eax中的值为_NR_fork这是fork产给int $0x80唯一的参数。可以看到_NR_fork的调用号是2,如下所示,然后根据系统调用表sys_call_table找到偏移地址找到对应的函数,fork系统调用的对应函数时不带参数的,所以对应的调用是syscall0。

       查看”include/asm-i386/unistd.h”可以看到各函数对应的系统调用号:

#ifndef _ASM_I386_U
【Windows Server 2019】活动目录 (Active Directory) ——将计算机加入域脱离域 博文介绍了如何将计算机加入AD域脱离AD域,包括加入域,验证客户机加入到域后的信息,使用域账户用户在客户机上登录,使用本地账户用户在计算机上登录,脱离域。 阅读详情

相关推荐

图像拼接——ITKMontage

ITKMontage是一个开源的、高性能的图像拼接软件模块。它的核心任务是将多张部分重叠的图像瓦片(Tiles)拼接成一幅完整的大图,专为处理材料显微科学中产生的大规模、高分辨率图像而设计。针对ITKMontage模块中示例进行了修改,解决了没有文件TileConfiguration.txt的情况,以及使用中的一些BUG。ITKMontage可以单独编译,也可以作为ITK的一个模块进行编译,介绍后一种的cmake设置。本文介绍使用ITKMontage模块进行图像拼接的方法。此处省略编译后的库配置。

2301_79131410的博客 81

分析单任务计算机操作之反汇编C程序

-中科大_243_石润成 本文旨在借助分析一段c语言程序反汇编代码来描述单任务计算机是如何工作的,不考虑中断等复杂操作。如有错误,希望读者能够反馈给我,不胜感激!          1.预备阶段 本文以example.c为例,代码如下: #include int g(int x) { return x+3; } int f(int x) { return g(x

ustc_max的专栏 1276

大模型系列——Ollama-OCR 简明教程

Llama 3.2-Vision 是一个多模态大型语言模型,有 11B 90B 两种大小,能够处理文本图像输入以生成文本输出。该模型在视觉识别、图像推理、图像描述回答与图像相关的问题方面表现出色,在多个行业基准测试中优于现有的开源闭源多模态模型。在本文中,我将介绍如何调用由 Ollama 运行的 Llama 3.2-Vision 11B 建模服务并使用实现图像文本识别 (OCR) 功能。

2401_84052244的博客 1万+

程序加载与运行过程

程序加载与运行过程

sy4331的博客 2341

10月22 号c语言作业5(6)

LMF19990420的博客 285

Linux | 项目自动化构建工具 - make/Makefile

还在一行行地使用gcc编译代码吗?试试项目自动化构建工具 —— make/Makefile

做技术人 · 产优质博客 · 找好工作 5343

Linux编程基础:第6章Linux进程管理 课后习题

《Linux编程基础》黑马程序员/编著清华大学出版社 目录 一、填空题 二、判断题 三、单选题 四、简答题 1、简单说明程序进程的区别。 2、分析程序,写出程序的执行结果。 五、编程题 1、编写程序,在程序创建一个子进程,使父子进程分别打印不同的内容。 2、编写程序,在程序创建一个子进程,使子进程通过exec更改代码段,执行cat命令。 一、填空题 1、进程的属性保存在一个被称为(进程控制块/PCB)的结构体中,这个结构体中包括(进程控制符/PID)、进程组、进程环境、进.

WHT869706733的博客 8388

Linux操作系统学习_用户进程fork()与exec函数族篇

环境:ubuntu12.04 LTS 1、fork()       由fork创建的新进程被称为子进程fork函数被调用一次,但返回两次。两次返回的唯一区别是子进程的返回值是0,而父进程的返回值则是新子进程进程ID。这是我们所熟知的过程,但是为什么会产生这样的结果?       将子进程ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程

king16304的博客 1348

【博客搬家】如何正确地应用Runtime类调用程序

 用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类Process类的方法实现。      下面是一种比较典型的程序模式:...    Process process = Runtime.getRuntime().exec(".\\p.exe");     process.waitfor( );...  

466

3.2 进程创建

1.概述 Linux系统中采用了与其他操作系统不同的方式创建进程。Linux将进程创建的两个步骤分解为fork()exec()。 fork()通过拷贝当前进程创建一个子进程。其与父进程的区别仅仅在于PID(每个进程唯一)、PPID(父进程进程号)某些资源统计量(如:挂起的信号,子进程不继承)。 exec()函数负责读取可执行文件并将其载入地址空间开始运行。 2.写时拷贝(copy-on-write) 2.1 背景 传统的fork()系统调用直接把所有的资源复制给新创建进程。这种实现过于简单且

weixin_39247141的博客 2516

进程管理:fork与exec函数及fork进程进程

http://blog.csdn.net/pipisorry/article/details/25134579 exec函数族 也许有不少读者从本系列文章一推出就开始读,一直到这里还有一个很大的疑惑:既然所有新进程都是由fork产生的,而且由fork产生的子进程进程几乎完全一样,那...

chuange6363的博客 469

java进程调用外部程序fork()+exec()分析

java进程要qi'd Runtime.getRuntime().exec(cmd) 的执行流程分析 继续上网查,大概意思是Java程序调用外部程序时可能需要分配跟父进程同等大小的内存。这就奇怪了,比如说,我随便调用一下ls命令,也需要很多内存吗?肯定是Java调用外部程序的接口里处理比较特殊。嗯,刚好JDK也开源,看看源码去。 分析SUN JDK 1.5 SRC,找到Runti

快乐程序员的专栏 5958

进程入门之exec族函数

昨天把虚拟机玩坏了,没办法,安装了一个新的18.04的Ubuntu,稍微美化了一下,重新安装了VMware Tools,感觉我的虚拟机完全成了Mac(虽说Mac的底层操作系统的确是根据Linux改的,所以性质差别不大),总之因祸得福,很满意!简单给你们来个截图康康[doge] 有点小帅吧,嘻嘻。Terminal感觉以前用的12.04的好看好用,进入今天的正题! exec族函数: 1.首先exec族有6个:execl、execlp、execle、execv、execvp、execvpe 2.我们用fork

ChrisKevin0221的博客 573

Linux系统上C语言程序编写与调试

可执行文件、C程序编译链接的过程、预处理、编译、汇编、链接、gcc编译器安装、gcc编译器使用、gcc一步编译、执行可执行程序的方法、make命令使用、make命令安装、makefile文件编写、gdb调试器安装、gdb调试C程序

weixin_50803498的博客 9998

C语言进阶教程(一个可执行文件生成的具体步骤)

本篇文章来讲解一个.c文件生成一个可执行文件的完整过程,我们学习了那么久,只知道在编译器中按下编译运行就可以将一个.c文件运行起来了,但是我们并不了解其中的具体步骤,那么下面我将会在Linux环境下给大家演示一下具体的操作。1.预处理2.编译3.汇编4.链接return 0;预处理阶段通过宏展开头文件包含等操作修改源代码。编译阶段将源代码转换为汇编语言或机器代码。汇编阶段将汇编语言转换为机器代码指令。链接阶段将目标文件运行时支持代码合并生成最终的可执行文件。

m0_49476241的博客 3652

进程创建替换——forkexec

进程控制——forkexec fork fork是UNIX系统中产生新进程的唯一办法 fork的作用是复制当前进程,生成子进程,子进程fork的位置继续执行。fork函数的特点概括起来就是“调用一次,返回两次”,在父进程中调用一次,在父进程进程中 各返回一次。fork就像一个叉子,把顺序执行的程序变成了两个分支,并发执行。 fork调用失败返回-1,子进程中for...

漫鱼 9277

exec函数与fork函数的配合使用

1.实现功能 当父进程检测到输入为1的时候,创建进程把配置文件的字段值(LENG=1修改为LENG=6)修改掉。代码如下: 将该修改配置文件通过gcc -o 编译生成可执行文件changeData,通过调用fork生成子进程,实现exec与fork的配合使用,具体代码如下: 配置文件如下: 2.运行结果 可以看出通过fork函数产生子进程再调用exec函数来模拟处理客户端请求,父进程则继续等待下一个服务请求。从代码编译运行调试过程中,不难发现,父子进程是互不干扰的。 ...

qiao代码的木偶人的博客 1004

linux中fork, sourceexec的区别

原文地址http://blog.chinaunix.net/uid-23622436-id-3222317.html shell的命令可以分为内部命令外部命令. 内部命令是由特殊的文件格式.def实现的,如cd,ls等.而外部命令是通过系统调用或独立程序实现的,如awk,sed. sourceexec都是内部命令.fork   使用 fork 方式运行 script 时, 就是让 she...

truemylife 290

fork,vfork 与exec的一些个人见解

转载来源http://blog.chinaunix.net/uid-20528014-id-4068931.html 作者:fireaxe_hq@hotmail.com 博客:fireaxe.blog.chinaunix.net 1) 先说说fork fork在linux中用于进程创建。它实际上是复制了一个与父进程(就是调用fork进程)一模一样的子进程。其主要

yanxinrui0027的博客 3959

fork()vfork()区别

<br />vfork用于创建一个新进程,而该新进程的目的是exec一个新进程,vforkfork一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,不会复制页表。因为子进程会立即调用exec,于是也就不会存放该地址空间。不过在子进程中调用exec或exit之前,他在父进程的空间中运行。<br /> 为什么会有vfork,因为以前的fork当它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,而往往在子进程中会执行exec调用,这样,前面的拷贝工作就是白费力气了,这种情

466

进程管理(vfork exec函数族 wait/waitpid)

fork与vfork的区别(1)fork进程拷贝父进程的数据段,vfork进程与父进程共享数据段。(2)fork父、子进程的执行次序不确定,vfork进程先运行,父进程后运行。(3)vfork有限制,子进程必须立刻执行_exit或者exec函数。进程终止的方式exec函数族wait/waitpid...

Cyber 587

man(2) V

vfork(2) #include <sys/types.h> #include <unistd.h> pid_t vfork(void); 功能:创建进程并阻塞父进 ---------------------------------------------------- 1 #include<sys/types.h&g...

weixin_30448603的博客 188
上一篇: 理解(*(void(*)())0)()和void (*signal(int, void(*)(int)))(int)
下一篇: 浅谈Linux操作系统是如何工作的?
ustc_max
博客等级 码龄14年 5粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值