进程的创建与可执行程序的加载

该实验通过fork和exec系统调用深入理解Linux进程创建。fork()创建新进程,新进程与父进程大部分属性相同但拥有独立的数据空间。exec()系列函数用于替换当前进程,启动新程序。在新进程中,原有的文件描述符保持打开状态,除非有执行时关闭标志。实验还分析了fork和exec在内核中的执行过程。
摘要由CSDN通过智能技术生成

ID **超  学号:SA*****256

实验内容:

1.参考进程初探 编程实现fork(创建一个进程实体) -> exec(将ELF可执行文件内容加载到进程实体) -> running program
2.参照C代码中嵌入汇编代码示例及用汇编代码使用系统调用time示例分析fork和exec系统调用在内核中的执行过程
3.注意task_struct进程控制块,ELF文件格式与进程地址空间的联系,注意Exec系统调用返回到用户态时EIP指向的位置。
4.动态链接库在ELF文件格式中与进程地址空间中的表现形式

实验目的:加深理解Linux工作原理

实验环境:Ubuntu12.10     内核版本3.5.0-17-generic

实验分析及过程:

第一部分:fork()  和 exec()

        在linux中,有三种方式可以启动新进程

1.使用system调用

#include<stdlib.h>
int system(const char* string);
它的作用是,运行以字符串参数的形式传递给它的命令并等待该命令的完成。命令的执行情况如同在shell中执行如下命令:

$ sh -c string
我们来看下面的一个例子吧:

#include<stdlib.h>
#include<stdio.h>

int main()
{
    printf("Running ps with system call\n");
    system("ps aux");
    printf("system call Done\n");
    exit(0);
}

在这里,我们相当于在shell中  输入了 ps aux 命令

2.使用fork()

#include<sys/types.h>
#include<unistd.h>
pid_t fork(void);

    这个系统调用复制当前进程,在进程表中创建一个新的表项,新表项中的许多属性与当前进程相同。但是新进程有自己的数据空间(堆和栈),环境和文件描述符。在父进程中的fork调用返回的是新的子进程的PID,而新进程返回的是0.程序代码也靠这一点来区分父子进程。创建失败返回-1.这边在之前看到过有这么一个解释,相当与是一个链状的进程序列,子进程没有儿子了,所以0相当于指

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值