精华内容
下载资源
问答
  • Linux创建进程函数

    2018-12-05 20:44:43
    创建进程函数 参考博客:https://www.cnblogs.com/xudong-bupt/archive/2013/03/26/2982029.htm 互斥变量:pthread_mutex_t 参考博客:https://blog.csdn.net/guotianqing/article/details/80559865 对互斥量...

    创建进程函数

    参考博客:https://www.cnblogs.com/xudong-bupt/archive/2013/03/26/2982029.htm

    互斥变量:pthread_mutex_t

    参考博客:https://blog.csdn.net/guotianqing/article/details/80559865

    对互斥量加锁解锁的函数

    #include <pthread.h>
    
    int pthread_mutex_tlock(pthread_mutex_t *mutex);
    int pthread_mutex_trylock(pthread_mutex_t *mutex);
    int pthread_mutex_unlock(pthreadd_mutex_t *mutex);
    

    sem_t

    参考博客:https://blog.csdn.net/Dancer__Sky/article/details/71101808

    sem_wait():使线程阻塞等待

    sem_post():解除A线程阻塞

    volatile

    volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

    展开全文
  • 创建进程的函数fork()、vfork()和execl()的介绍 本Unix/linux创建进程的函数fork和vfork以及它们的差别。
    创建进程的函数fork()、vfork()和execl()
    本次内容主要介绍Unix/linux下2个创建进程的函数fork和vfork以及它们的差别。


    1.fork函数


    (1)函数的格式
       #include <unistd.h>
       pid_t fork(void);
    函数功能:
    主要用于以复制正在运行进程的方式来创建新的进程,其中新进程叫做子进程,正在运行的进程叫做父进程。
    返回值:
    函数调用成功时,父进程返回子进程的PID,子进程返回0,函数调用出错时,父进程返回-1,子进程没有被创建。

    注意:

    此函数的返回值有2个,主要原因是因为在fovk执行结束前,运行到x行 就已经创建出了一个子进程,所以父子进程都会会执行x行到return语句的代码。为了能找到自己的儿子,所以父进程会返回子进程的pid,子进程能通过getpid()找到父进程,因此子进程返回0即可。



    (2)fork创建子进程的工作方式
    1)fork函数之前的代码,父进程执行依次。
    2)fork函数之后的代码,父子进程各自执行一次。
    3)fork函数的返回值,父子进程各自返回一次。


    (3)fork创建的父子进程之间的关系
    1)父进程启动子进程,父子进程同时启动,如果子进程先结束,会给父进程发信号,让父进程帮助子进程回收资源。
    2)如果父进程现在结束,子进程变成孤儿进程,子进程会变更父进程(重新指定init进程为新的父进程),init进程也叫做孤儿院。
    3)如果子进程先结束,但是父进程由于各种原因并没有收到子进程发来的信号,也就是没有帮子进程回收资源,那么子进程会变成僵尸进程。


    (4)fork函数创建的父子进程之间的内存资源关系
    进程的内存区域划分:代码区、全局区、堆区、栈区
    子进程是父进程的副本,子进程获得父进程数据段和堆栈段(包括I/O流缓冲区)的拷贝,但子进程共享父进程的代码段。 父进程的文件描述符表也会被复制到子进程中,二者共享同一个文件表。所以如果在父子进程中,有不需要的描述符的话,最好要close。


    ------------------------------------------------------------------------------------------------------------------------


    2.vfork和execl函数


    (1)vforK函数
       #include <sys/types.h>
       #include <unistd.h>
       pid_t vfork(void);
    函数功能:
    该函数的功能与fork函数类似,返回值和出错原因等参数fork函数即可,但是所不同的是,该函数创建的子进程不会复制父进程中的内存区域,而是直接占用,导致父进程进入阻塞状态,直到子进程结束或者调用exec系列函数为止,而子进程的结束应该去调用_exit()函数。


    注意:
    vfork函数保证创建的子进程先执行。



    (2)exec系列函数
       int execl(const char *path, const char *arg, ...);
    第一个参数:执行的文件路径
    第二个参数:执行的参数,一般给文件名即可
    第三个参数:可变长参数,最后使用NULL结尾
    函数功能:
    主要用于按照参数指定的路径和方式区执行文件。
    如:
    使用execl函数执行ls -l 命令时:
    execl("/bin/ls", "ls", "-l", NULL);


    注意:
    vfork函数本身没有太大的实际意思,一般与exec系列函数搭配使用,而vfork函数负责创建子进程,exec系列函数负责执行新的代码。
    fork函数也可以和exec系列函数搭配使用,一般很少使用。



    ------------------------------------------------------------------------------------------------------------------------


    fork与vfork的差别及其应用

    从概念上说来,可以将fork()认为对父进程的副本,除了文本区是共享之外,其它都是创建拷贝的。这是早期fork函数的实现,这种做法大大的耗费了内存的资源,相比之下vfork()创建的子进程则是共享了父进程的内存,效率远比fork函数高。在fork()采用写时复制前,vfork()可以说完全取代fork()。


    为了解决fork函数造成不必要的浪费,内核对父进程的数据区、BBS段、堆区和栈区采用了写时复制(copy-on-write)技术来处理。这种技术大致可以理解为,父子进程先共享内存,如果整个程序结束前,父子进程都没有对内存进行写操作,那么子进程就没必要对父进程的内存进行拷贝。最初,内核做了一些设置,令这些段的页表项指向父进程相同的物理内存业,并将这些页面自身标为只读。调用fork()后,内核会捕捉所有父进程或子进程针对这些页面的修改企图,并为将要修改的页面创建拷贝。系统将心的页面拷贝分配给遭内核捕获的进程,还会对子进程的相应页表项做适当调整。从这一刻起,父、子进程可以分别修改各自的页拷贝,不再相互影响。


    相比与fork(),vfork()是为子进程立即执行exec()系列的程序而专门设计的。主要原因如下
    1:vfork()无需为子进程复制虚拟内存或页表。相反,子进程共享父进程内存,直至其成功执行了exec()或者调用-exit()退出。
    2:vfork()创建的子进程在调用exec()或_exit()之前,将暂停执行父进程。


    fork与vfork的运用场景
    一般fork与vfork、exec配合到进程终止的函数一起使用的,关于进程的函数这里就不多讨论。下面我举个模拟银行的例子,通俗的对这2个函数的基本使用进行一个大致的描绘。


    假设这模拟个银行只有取款与存款这么两个功能,要求是程序可以同时执行取款和存款这2个程序,并且能实现多个客户同时存款和取款。
    同时执行存款和取款的话,使用vfork()+exec()函数最适合不过,父进程创建2个子进程,子进程A负责存款业务,子进程B负责取款业务。如此类推,有多少个业务,父进程就使用vfork()+execl()创建多少个子进程。
    在存款进程中,A会等待存款消息,当捕获了一个存款消息后,进程A就fovk()一个子进程,子进程就负责处理这个消息,那么在存款进程中,父进程负责的是捕获消息,具体的处理工作都交给了子进程,这样就能实现多个进程的并发处理,加快业务处理的效率。
    取款进程同上。


    总结:fovk()+execl()是创建多个功能不一样的进程处理不同的业务,fovk则是创建多个功能一样的进程去处理相同的业务!


    (最后关于这个模拟银行的练习代码,不久再整理出来好了)
    展开全文
  • 创建进程的函数

    2019-10-05 18:26:19
    fork 创造的子进程复制了父亲进程的资源,包括内存的内容task_struct内容,新旧进程使用同一代码段,复制数据段和堆栈段,这里的复制采用了注明的copy_on_write技术,即一旦子进程开始运行,则新旧进程的地址空间已经...

    clone()、fork()、vfork()都是Linux的系统调用。

    进程一般由代码段、数据段和PCB进程控制块组成。

     

    fork 创造的子进程复制了父亲进程的资源,包括内存的内容task_struct内容,新旧进程使用同一代码段,复制数据段和堆栈段,这里的复制采用了注明的copy_on_write技术,即一旦子进程开始运行,则新旧进程的地址空间已经分开,两者运行独立。

    优点是子进程的执行独立于父进程,具有良好的并发性。

    缺点是两者的通信需要专门的通信机制,如pipe、fifo和system V等。

    其实在复制过程中,子进程复制了父进程的task_struct,系统堆栈空间和页面表,在子进程运行前,两者指向同一页面。而当子进程改变了父进程的变量时候,会通过copy_on_write的手 段为所涉及的页面建立一个新的副本。因此fork效率并不低。

     

    vfork函数创建的子进程完全运行在父进程的地址空间上,子进程对虚拟地址空间任何数据的修改都为父进程所见。这与fork是完全不同的,fork进程是独立的空间。另外一点不同的是vfork创建的子进程后,父进程会被阻塞,直到子进程执行exec()和exit()。

    当创建子进程的目的仅仅是为了调用exec()执行另一个程序时,子进程不会对父进程的地址空间又任何引用。因此,此时对地址空间的复制是多余的,通过vfork可以减少不必要的开销。

     

    系统调用fork()和vfork()是无参数的,而clone()则带有参数。fork()是全部复制,vfork()是共享内存,而clone()是则可以将父进程资源有选择地复制给子进程,而没有复制的数据结构则通过指针的复制让子进程共享,具体要复制哪些资源给子进程,由参数列表中的clone_flags来决定。另外,clone()返回的是子进程的pid。 

    轻量级进程由clone()函数创建。clone函数功能强大,带了众多参数,因此由他创建的进程要比前面2种方法要复杂。clone可以让你有选择性的继承父进程的资源,你可以选择想vfork一样和 父进程共享一个虚存空间,从而使创造的是线程,你也可以不和父进程共享,你甚至可以选择创造出来的进程和父进程不再是父子关系,而是兄弟关系

    int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);
    这里fn是函数指针,我们知道进程的4要素,这个就是指向程序的指针,就是所谓的“剧本", child_stack明显是为子进程分配系统堆栈空 间(在linux下系统堆栈空间是2页面,就是8K的内存,其中在这块内存中,低地址上放入了值,这个值就是进程控制块task_struct的 值),flags就是标志用来描述你需要从父进程继承那些资源, arg就是传给子进程的参数)。
     
    系统调用服务例程sys_clone, sys_fork, sys_vfork三者最终都是调用do_fork函数完成.

    do_fork的参数与clone系统调用的参数类似, 不过多了一个regs(内核栈保存的用户模式寄存器). 实际上其他的参数也都是用regs取的

    • clone:
      •     clone的API外衣, 把fn, arg压入用户栈中, 然后引发系统调用. 返回用户模式后下一条指令就是fn.
      •     sysclone: parent_tidptr, child_tidptr都传到了 do_fork的参数中
      •     sysclone: 检查是否有新的栈, 如果没有就用父进程的栈 (开始地址就是regs.esp)
    • fork, vfork:
      •     服务例程就是直接调用do_fork, 不过参数稍加修改
      •     clone_flags:
        •    sys_fork: SIGCHLD|0;
        •    sys_vfork: SIGCHLD| (clone_vfork | clone_vm)
      •     用户栈: 都是父进程的栈.
      •     parent_tidptr, child_ctidptr都是NULL.
    以上有内容引用来自http://www.51develop.net/forum.php?mod=viewthread&tid=8963
     
     copy_process()创建进程描述符以及子进程执行所需要的所有其他数据结构。它的参数与do_fork()参数相同,外加子进程的PID。
     
     
     

    转载于:https://www.cnblogs.com/LarryGen/p/4931575.html

    展开全文
  • 原文地址:https://blog.csdn.net/u013013553/article/details/42031793 Linux创建进程和执行所创建进程分为2个阶段。 第一个阶段是创建。父进程首先复制子进程,所复制出来子进程拥有自己任务结构体和...

       原文地址:https://blog.csdn.net/u013013553/article/details/42031793   

        Linux将创建进程和执行所创建的进程分为2个阶段。

        第一个阶段是创建。父进程首先复制子进程,所复制出来的子进程拥有自己的任务结构体和系统堆栈,除此之外所有资源都与父进程共享。Linux提供两种方式复制子进程:一个是fork(),另外一个是clone()。fork()函数复制时将父进程的所以资源都通过复制数据结构进行了复制,然后传递给子进程,所以fork()函数不带参数;clone()函数则是将部分父进程的资源的数据结构进行复制,复制哪些资源是可选择的,这个可以通过参数设定,所以clone()函数带参数,没有复制的资源可以通过指针共享给子进程。

        

    Clone()函数的声明如下:

    int clone(int (*fn)(void *), void*child_stack, int flags, void *arg)

    其中,fn为函数指针,此指针指向一个函数体,即想要创建进程的静态程序;

    child_stack为给子进程分配系统堆栈的指针;

    arg就是传给子进程的参数;

    flags为要复制资源的标志:

          CLONE_PARENT   创建的子进程的父进程是调用者的父进程,新进程与创建它的进程成了“兄弟”而不是“父子”

          CLONE_FS           子进程与父进程共享相同的文件系统,包括root、当前目录、umask

          CLONE_FILES      子进程与父进程共享相同的文件描述符(file descriptor)表

          CLONE_NEWNS   在新的namespace启动子进程,namespace描述了进程的文件hierarchy

          CLONE_SIGHAND   子进程与父进程共享相同的信号处理(signal handler)表

          CLONE_PTRACE   若父进程被trace,子进程也被trace

          CLONE_VFORK     父进程被挂起,直至子进程释放虚拟内存资源

          CLONE_VM           子进程与父进程运行于相同的内存空间

          CLONE_PID          子进程在创建时PID与父进程一致

          CLONE_THREAD    Linux 2.4中增加以支持POSIX线程标准,子进程与父进程共享相同的线程群

    fork()可以看成是完全版的clone(),而clone()克隆的只是fork()的一部分。

       

            第二个阶段就是所创建进程的执行。子进程创建完后一般都会走自己的路。Linux为了子进程能做自己的事特意提供了一个系统调用execve(),用以执行一个可执行程序的映像,这个映像以文件形式存在(这句话其实就是说用execve()可以调用一个可执行程序,因为这个可执行程序就在磁盘上,所有是以文件形式存在的,而映像是说已经编译链接好了的,只要调入内存就可以执行,一般为二进制文件)。vfork创建的子进程要先于父进程执行,子进程执行时,父进程处于挂起状态,子进程执行完,唤醒父进程。


    展开全文
  • 主要介绍了使用C语言的fork()函数Linux创建进程的实例讲解,fork在父进程下创建出的子进程可以与父进程一起来多进程运行同一个程序,需要的朋友可以参考下
  • Linux中所有的进程都是pid为1的init进程的子进程,内核在系统启动的最后阶段启动init进程。系统中的所有进程都有一个父进程,在进程描述符中有指向父进程的指针,具有同一个父进程的进程称为兄弟进程,同时每个...
  • Linux创建进程的fork()函数

    千次阅读 2016-06-30 23:49:22
    今天总结一下Linux的进程创建... 在Linux中,fork函数的功能就是在一个进程中创建一个新的进程,当前调用fork函数的进程就是产生的新进程的父进程,新进程在一下也称为子进程。在新进程生成之后就会在系统中开始执行。
  • linux的进程创建以及父子进程代码
  • 使用fork函数创建一个进程 pid_t fork(void) fork函数调用成功,返回两次 返回值为0;代表当前进程是子进程 返回值为非负数,代表当前进程为父进程 如果调用失败则返回-1 代码 #include <sys/types.h> #...
  • //pid_t就是一个整形类型 返回值: 成功的情况下,父进程返回子进程的id(非负整数),子进程返回0; 失败的情况,父进程返回-1,创建子进程失败,也就是没有创建子进程。 举例说明: int main(int argc,char* ...
  • 作者:吴乐 山东师范大学 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...4.跟踪到ret_from_fork子进程创建完成。 二、代码部分分析 Fork系统调用代码在l
  • Linux进程创建函数vfork简介

    千次阅读 2016-07-04 22:10:13
    vfork用于创建一个新进程,而该新进程的目的是exec一个新程序。vfork与fork都创建一 个子进程,但它不将父进程的地址空间复制到子进程中, 因为子进程会立即调用 exec,于是不会存访问该地址空间。 相反,在子进程...
  • fork是一个在Linux系统环境下专有的函数,现有的进程调用fork后将会创建一个新的进程,这里我们就来看一下Linux中使用C语言的fork()函数创建进程的实例教程
  • vfork()函数创建进程与 fork()函数创建进程 的区别: 关键区别一: vfork()直接使用父进程的 存储空间,不进行拷贝。 关键区别二: vfork()保证子进程先行运行,当子进程调用 exit 退出后,父进程才会执行。 ...
  • fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同事,但如果初始参数或者传入变量不同,两个进程也可以做不同事。 调用成功时两个返回值 1)父进程返回当前子...
  • 前面两节简要地从C语言源...Linux 是如何创建进程的呢?Linux 系统中的进程创建许多操作系统都提供了专门的进程产生机制,比较典型的过程是:首先在内存新的地址空间里创建进程,然后读取可执行程序,装载到内存中执...
  • fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同事,但如果初始参数或者传入变量不同,两个进程也可以做不同事。  一个进程调用fork()函数后,系统先给新...
  • 1、函数简介 1)、得到当前进程id pid_t getpid();... 要创建进程,必须调用fork函数, 系统调用fork用于派生一个进程,函数原型如下 #include #include pid_t fork(void) 若成功,父进程
  • Linux7:多进程初步:进程相关概念,创建进程,特殊进程,进程资源清理,进程退出,exec函数族以及system函数 1.进程描述: 进程初探: 程序 可执行二进制代码文件 进程 程序被加载到内存中运行 系统中基本...
  • 系统调用函数fork()是创建一个新进程的唯一方式,fork()函数是Linux系统中一个比较特殊的函数,其一次调用会有两个返回值。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程。
  • linux进程创建常用函数

    千次阅读 2012-12-12 21:53:42
    获取进程ID #include #include pid_t getpid(void) //获取本进程ID pid_t getppid(void) //获取父进程ID ...创建子进程 ...//功能:创建子进程 ...父进程中,fork返回新创建的子进程的PID //2.子进程中,f
  • Linux中fork()函数创建进程

    千次阅读 2019-05-09 22:05:09
    Linux系统中学习fork函数创建进程前言一.准备工作二.任务三.感想 前言    最近学习到操作系统原理中的进程同步的知识点时,为了加深对进程的了解,就实践了一下在Linux系统中fork()函数的使用。 一.准备工作 ...
  • 3. Linux下进程相关API 之创建进程函数 3.1 fork函数 3.1.1 fork 函数原型 Fork 英文意思是叉子 ,意思是 从一个进程分出多个进程 (两个执行流)。 #include <sys/types.h> #include <unistd.h> pid_...
  • 1)了解进程概念,掌握fork函数和vfork函数的特性和使用方法,观察fork函数和vfork函数的工作机制; 2)理解进程之间的创建关系,认识多进程程序中父子进程之间关系及创建原理; 2、实验环境 Red Hat 企业版...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,117
精华内容 2,046
关键字:

创建进程的函数linux

linux 订阅