进程创建函数fork()、vfork() ,以及excel()函数

一、进程的创建步骤以及创建函数的介绍

1、使用fork()或者vfork()函数创建新的进程

2、条用exec函数族修改创建的进程。使用fork()创建出来的进程是当前进程的完全复制,然而我们创建进程是为了让新的进程去执行新的程序,因此,就需要用到exec函数族对创建出来的新进程进行修改,让他拥有和父进程不一样的东西,修改后就可以执行新的程序,当然,修改后的子进程包含了要执行程序的信息。

在Linux中,fork()和vfork()就是用于创建进程的两个函数,他们的相关信息如下:

创建进程函数:

pid_t fork(void)//成功返回0,失败返回-1

fork()用于创建新的进程,所创建进程为当前进程的子进程,可以通过fork()函数的返回质6来控制进程是在父进程中还是在子进程中。如果运行在父进程中,则返回PID为子进程的进程号,如果在子进程中,则返回的PID为0

pid_t vfork(void)//成功返回0,失败返回-1

vfork()函数和fork()函数比较类似,都用于创建子进程。只是其用于创建新的进程,父子进程共享虚拟内存空间。然而在内核中,vfork()的实现任然调用fork()函数,调用函数如下:

sys_vfork(struct pt_regs *regs)
{
        return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->gr[30], regs, 0, NULL, NULL);
}

 

 

在上述函数中,pid_t为隐含类型,实际上就是一个int的类型。隐含类型只数据类型的物理表示是未知的或者是不相关的

二、实现过程和区别

1、Linux是通过_cloen()系统调用来实现fork()的,这一调用通过一系列的参数标志来指明父子进程需要的资源。Fork(),vfork(),_cloen()库函数都根据各自需要的参数标志去调用cloen(),然后由cloen()去调用do_fork()函数,do_fork()函数也就是真正的创建进程的函数。他完成了创建进程的大部分工作。同时他还会调用copy_process()函数。然后让进程开始运行。

2、vfork()和fork()的功能相同,除了不拷贝父进程的页表项,也就是说不会复制和父进程相关的资源,父子进程将共享地址空间,子进程对虚拟内存空间的任何实际修改实际上是在修改父进程虚拟内粗空间的内容。并且其父进程会被阻塞,直到子进程退出或者执行exec()函数族.这样由于父子进程共享地址空间,避免了fork在资源复制是的消耗。

3、写时copy机制:Linux系统采用了“些操作时复制”的方法,其是一种延迟资源复制的方法,子进程在创建的时候并不复制父进程的相关资源,父子进程通过访问相同的物理内存来伪装已经实现了的对资源的复制。这种共享是制度方式是只读方式,这一点与vfork是不同的,当子进程对内存数据存在这些的操作时,才会进香资源的复制。正是由于这种机制的出现,vfork()好像已经没有什么作用了。

三、在进程窗创建过程中copy_process()函数完成的工作//摘自:Linux内核设计与实现

1、调用dup_task_struct()为心进程创建一个内核栈、thread_info结构和task_struct,这些值与当前进程的值相同。此时,子进程和父进程的描述符完全相同。

2、检查新创建的这个子进程后,当前用户所用有的进程数目没有超过给他分配的资源的限制

3、现在,子进程着手使自己与父进程区别开来,进程描述符内的许多成员都要被清0或者设置初始值。进程描述符的成员值并不是继承而来的,而主要是统计信息,进程描述符中的大多数数据都是共享的。

4、接下来,子进程的状态被设置为不可终端等待状态以保证他不会投入运行

5、copy_process()调用copy_flags()以更新task_struct的flags成员。表明进程是拥有超级用户权限的PF_SUPER[RIV标志被清0。表明进程还没有调用exec()函数的PE_FORKNOEXEC标志被设置。

6、调用get_pid()为新进程获取一个有效的PID

7、根据传给cloen()的参数标志copy_process()拷贝或者共享打开的文件、文件系统信、信号处理函数、进程地址空间和命名空间等。

8、让父进程和子进程平分剩余的时间片。

9、最后,copy_proccess()做扫尾工作并返回一个只想子进程的指针。

 

 

相关函数:fork, execle, execlp, execv, execve, execvp
表头文件:#include 
函数定义:int execl(const char *path, const char *arg, ...);
函数说明:execl()用来执行参数path字符串所代表的文件路径, 接下来的参数代表执行该文件时传递的argv[0],argv[1].....是后一个参数必须用空指针NULL作结束
返回值   :成功则不返回值, 失败返回-1, 失败原因存于errno中
错误代码:参execve()
范例:

 

 

  1. [   
  2. /*  执行 /bin/ls  -al  /ect/passwd */  
  3.   
  4. #include <unistd.h>   
  5. /**  
  6. * File: execl.c  
  7. *  
  8. */  
  9. main()   
  10. {   
  11.     execl("/bin/ls", "ls", "-al", "/etc/passwd", (char *) 0);   
  12. }   

 

时间: 2024-10-21 16:08:25

进程创建函数fork()、vfork() ,以及excel()函数的相关文章

UC编程7-进程创建函数fork/vfork 和 execl/信号signal的使用1

//myuc.h #include<stdio.h>//io流 #include<stdlib.h>//标准库 #include<unistd.h>//uc标准头文件 #include<fcntl.h>//文件控制 #include<string.h>//c字符串 #include<sys/types.h> #include<sys/mman.h>//内存映射 #include<sys/stat.h>//文件状

Excel函数与公式的概念

Excel函数即是预先定义,执行计算.分析等处理数据任务的特殊公式.以常用的求和函数SUM为例,它的语法是"SUM(number1,number2,--)".其中"SUM"称为函数名称,一个函数只有唯一的一个名称,它决定了函数的功能和用途.函数名称后紧跟左括号,接着是用逗号分隔的称为参数的内容,最后用一个右括号表示函数结束. 参数是函数中最复杂的组成部分,它规定了函数的运算对象.顺序或结构等.使得用户可以对某个单元格或区域进行处理,如分析存款利息.确定成绩名次.计算

Excel函数应用教程:函数与公式的概念

什么是函数? Excel函数即是预先定义,执行计算.分析等处理数据任务的特殊公式.以常用的求和函数SUM为例,它的 语法是"SUM(number1,number2,......)".其中"SUM"称为函数名称,一个函数只有唯一的一个名称,它决定了函数的功能和用 途.函数名称后紧跟左括号,接着是用逗号分隔的称为参数的内容,最后用一个右括号表示函数结束. 参数是函数中最复杂的组成部分,它规定了函数的运算对象.顺序或结构等.使得用户可以对某个单元格或区域进行处理,如分析存

教你Excel函数的输入方法

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   在讲解 Excel函数的输入方法前,先让大家了解函数与公式的概念及区别. 什么是函数? Excel函数即是预先定义,执行计算.分析等处理数据任务的特殊公式.以常用的求和函数SUM为例,它的语法是"SUM(number1,number2,--)".其中"SUM"称为函数名称,一个函数只有唯一的一个名称,它决定了函数的功能和用

4进程原语:fork()函数,getpid()函数和getppid()函数,getuid()函数,getgid()函数,vfork()

 1fork()函数 子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同.fork调用一次返回两次,有以下特点: A:父进程中返回子进程ID B:子进程中返回0 C:读时共享,写时复制 2fork()依赖的头文件 #include <unistd.h> 3fork()函数说明: pid_tfork(void);                            通过该函数创建一个子进程 4案例说明: 总结: A因为读时共享和写时复制,子进程会复制父进程的代码,但是从fo

Linux系统中C语言编程创建函数fork()执行解析_C 语言

最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解.现总结如下: 1.函数本身 (1)头文件 #include<unistd.h> #include<sys/types.h> (2)函数原型 pid_t fork( void); (pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中) 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID:否则,出错返回-1 (3)函数说明 一

Linux下C编程,子进程创建函数fork() 执行解析

最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解.现总结如下: 1.函数本身 (1)头文件 #include<unistd.h> #include<sys/types.h> (2)函数原型 pid_t fork( void); (pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中) 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID:否则,出错返回-1 (3)函数说明 一

mfc多线程-MFC循环创建多线程同时处调用同一函数读写文本和excel操作

问题描述 MFC循环创建多线程同时处调用同一函数读写文本和excel操作 CString fname[3000]; CString name[1024] ; int j1 ; int nIndex = 0; void CDisposeXJXDlg::OnBtnSelSrcFile() { // TODO: Add your control notification handler code here CFileDialog dlg(TRUE, NULL, NULL ,OFN_HIDEREADON

使用excel函数分离姓名和手机号码的方法

      使用excel函数分离姓名和手机号码的方法       例:如下图所示,要求把A列的内容拆分到B列和C列. 分析:汉字是双字节,而字母和数字是单字节.而在excel函数中有一类是带B的函数,如leftb,rightb,midb,Searchb函数,它们可以区分单双字节,所以我们就可以利用带b的函数来解决这个问题. B2公式: =LEFTB(A2,SEARCHB("?",A2)-1) C2公式 =MIDB(A2,SEARCHB("?",A2),11) 公式