`

linux系统编程二——进程fork函数理解

阅读更多

#include <sys/types.h>
#include <sys/wait.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    char buf[20] = "hello parent";
//栈区


    char *pb = new char[20];
//堆


    int n = 0;

    pid_t pid = 0;

    memset(pb, 0 ,20);

     pb[0] = 'p';

    if ((pid = fork()) < 0)
    {
        cout<<"fork error!"<<endl;

        exit(1);
    }
    else if (pid == 0 )
//子进程

    {
         buf[0] = 'c';

         pb[0] = 'c';

         n = 1;
    }
    else
    {
        sleep(10);
//让父进程休眠,子进程先执行

    }

    cout<<getpid()<<":n address "<<(&n)<<",n="<<n
        <<"\tbuf address "<<(&buf)<<",buf="<<buf
        <<"\tpb addrss "<<(&pb)<<",pb="<<pb<<endl;

    exit(0);
}


输出结果为

15144:n address 0xbfe1f168,n=1 buf address 0xbfe1f170,buf=cello parent pb addrss 0xbfe1f16c,pb=c
15143:n address 0xbfe1f168,n=0 buf address 0xbfe1f170,buf=hello parent pb addrss 0xbfe1f16c,pb=p

 

   15144是子进程,15143是父进程,它们之间的变量的地址是一样的(在各自的进程地址空间内),子进程修改了变量的值,但是却没有影响到父进程,说明了子进程中的变量是父进程的一个副本,不会因为子进程中改变了它们的值而影响

父进程,也就是子进程中具有父进程的数据段的副本。子进程和父进程共享的只是代码段。

 

   fork是一个特殊的函数,它执行一次,返回两次,在子进程中返回0,父进程中返回子进程的pid。当执行了fork函数后,子进程和父进程就开始在fork之后产生分支了,父进程和子进程分别向下执行。由于父进程和子进程并没有公共的数据段,所以无法使用公共的数据段作为系统通信的载体,可以使用无名管道(fifo创建),或者有名管道(mkdifo创建后,产生管道名字,接着使用open打开读写)进行通信。

   当子进程结束的时候,会向父进程发送一个SIGCHLD信号。因为子进程终止是个异步事件(可以在父进程允许的任何时候发送),这在信号也是内核向父进程发的异步通知。父进程可以选择忽略它,或者提供一个信号

分享到:
评论

相关推荐

    操作系统编程实验——创建进程.pdf

    操作系统编程实验——创建进程是操作系统编程的基础之一,本实验的目的是熟悉操作系统程序接口的使用,并学习如何使用fork()函数创建子进程。 知识点1:操作系统编程实验的重要性 操作系统编程实验是操作系统课程的...

    linux高级编程知识点总结——进程线程

    ### Linux高级编程知识点总结——进程线程 #### 进程与程序的区别及PCB - **进程与程序的区别**: - **程序**:指一组指令的有序集合,以文件形式存储在磁盘等存储媒介上,是一个静态的概念。 - **进程**:是一...

    III.Linux系统编程_30进程_3进程控制借鉴.pdf

    《Linux系统编程_30进程_3进程控制借鉴》章节主要讲述了Linux系统中的核心概念——进程控制,特别是关于`fork()`函数的使用及其工作原理。`fork()`函数是Linux系统中用于创建新进程的关键系统调用,它通过复制当前...

    LINUX实验程序——————初学者

    4. **系统调用**:描述中提到的“相关的系统编程的函数理解”可能是指Linux中的系统调用,如open()用于打开文件,read()和write()用于文件读写,close()用于关闭文件,还有fork()和exec()用于进程管理。 5. **网络...

    linux系统编程教程

    其次,进程管理是Linux编程中的重要部分。`fork()`系统调用创建一个与父进程几乎完全相同的子进程,而`wait()`和`waitpid()`则用于等待子进程结束并回收其资源。`exec()`系列系统调用允许一个进程替换其自身的映像来...

    操作系统实验——进程创建与进程间通信

    在Unix/Linux系统中,最常用的进程创建函数是`fork()`. 它会创建一个与父进程几乎完全相同的子进程,包括其内存映像、打开的文件等。实验中提到的“进程树”是指由一个父进程创建多个子进程,这些子进程又可以创建...

    linux进程编程介绍

    Linux通过系统调用来管理进程,如`fork()`用于创建新进程,`exec()`系列函数用于替换进程的执行映像,`wait()`和`waitpid()`则用于等待子进程结束。 当我们谈论Linux进程编程时,`fork()`是最基础的操作。这个系统...

    Linux系统编程实验六进程间通信.docx

    在本实验中,我们主要探讨了Linux系统编程中的两个核心...这些知识点是Linux系统编程的基础,对于理解和实现多进程间的协作、异常处理以及异步通信至关重要。掌握这些技能对于开发高效、可靠的Linux应用程序非常有用。

    Linux下C编程实战——源代码.7z

    1. 进程管理:了解fork()创建子进程,exec()系列函数替换当前进程,wait()、waitpid()等待子进程结束。 2. 线程编程:使用pthread库创建线程(pthread_create()),同步(pthread_mutex_t、pthread_cond_t)、通信...

    linux的进程函数

    本文将深入探讨Linux中的核心进程函数——`fork()`,以及它在创建新进程时的作用。 `fork()`是Linux系统调用中最基本的一个,它的主要功能是创建一个新的进程。当一个进程调用`fork()`时,系统会在当前进程的基础上...

    fork函数[归类].pdf

    总的来说,理解fork函数的运作机制对于进行有效的进程管理和并发编程至关重要。它不仅是Unix/Linux系统中的基础功能,也是实现高级并发模型和系统级编程的关键工具。通过深入学习和实践,我们可以更好地利用这个强大...

    linux进程之fork创建新进程.zip

    在Linux操作系统中,`fork()`函数是创建新进程的关键接口,它是C语言标准库中的一个系统调用。这个过程被称为进程复制或者 fork。本压缩包包含的`fork.c`源代码文件很可能展示了如何使用`fork()`函数来创建一个新的...

    Linux进程控制编程-父子进程对数据段的访问实例.pdf

    最后,参考文献中提到的《基于项目驱动的嵌入式Linux应用设计开发》一书,通常会涵盖更多关于Linux进程控制的实践案例,包括进程间通信、信号处理、线程同步等,对于深入理解和应用Linux系统编程非常有帮助。...

    编译原理——linux高级编程

    本资源包"Linux高级编程_10441454"很可能包含了一系列关于Linux系统编程、系统调用、进程管理、内存管理、文件I/O等方面的教程或资料,帮助你掌握在Linux环境下进行复杂程序设计的技巧。 编译原理主要包括词法分析...

    操作系统实验作业——linux系统调用学习,重定向、管道、多进程、多线程编程技术实现.zip

    操作系统是计算机系统的核心组成部分,它负责管理系统...通过完成这个实验,你不仅可以深化对操作系统基本概念的理解,还能熟练掌握Linux编程技巧,这些技能对于未来从事系统级开发或者进行高性能计算都是非常重要的。

    Linux下C语言编程--进程的创建

    ### Linux下C语言编程——进程的创建 #### 一、进程的概念 在现代操作系统中,程序与进程是两个重要的概念。程序是指一个包含了可执行代码的文件,它本身是静态的,而进程则是指已经开始执行但尚未结束的程序实例...

    linux操作系统下c语言编程入门

    ### Linux操作系统下C语言编程入门知识点详解 #### (一) 目录介绍 本文档将详细介绍在Linux操作系统环境下使用C语言进行编程的相关知识点。主要内容包括: 1. **Linux程序设计入门——基础知识** - 源程序编译 ...

    fork 两个子进程 及其进程控制

    `fork()`是Unix/Linux系统中的一个系统调用,用于创建一个新的进程——子进程。当父进程调用`fork()`时,操作系统会复制父进程的所有资源(如内存空间、文件描述符等)给新创建的子进程,形成一份完全独立的副本。...

Global site tag (gtag.js) - Google Analytics