美文网首页
进程api与控制

进程api与控制

作者: 烫烫烫烫烫烫烫烫烫烫烫烫 | 来源:发表于2019-05-17 14:53 被阅读0次

进程创建

 创建进程:
     pid_t fork(void);
 返回值:
    失败 -1, 成功返回两次,在父进程中返回值为子进程ID,在子进程中返回父进程ID
 注:
    子进程的代码和父进程的代码是一致的,但是子进程启动之后是从fork之后开始执行的


 获得pid,进程id,获得当前进程:
    pid_t fork(void);


 获得当前进程父进程的id
    pid_t getppid(void);

进程创建示例代码:

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

int main()
{
    printf("Begin ....\n");
    pid_t pid = fork();
    if(pid < 0){
        perror("fork err");
        exit(1);
    }
    if(pid == 0){
        //子进程
        printf("I am a child,pid = %d,ppid=%d\n",getpid(),getppid());
        while(1){
            printf("I am a child\n");
            sleep(1);
        }
    }
    else if(pid > 0){
        //父进程的逻辑
        printf("childpid=%d,self=%d,ppid=%d\n",pid,getpid(),getppid());
        while(1){
            sleep(1);
        }
    }
    printf("End ....\n");
    return 0;
}

代码示例 用父进程创建N个子进程:

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

int main()
{
    int n = 5;
    int i =0;
    pid_t pid = 0;
    for(i = 0; i < 5 ; i ++){//父进程循环结束
        pid = fork();
        if(pid == 0){
            //son 
            printf("I am child ,pid=%d,ppid=%d\n",getpid(),getppid());
            break;//子进程退出循环的接口 , 否则子进程也会创建自己的子进程,因为fork是在一个循环中的
        }else if(pid > 0){
            //father 
            printf("I am father,pid=%d,ppid=%d\n",getpid(),getppid());
        }
    }
     sleep(i);
    if(i < 5){
        printf("I am child ,will exit,pid=%d,ppid=%d\n",getpid(),getppid());
    }
    else{
        //father
        printf("I am parent,will out pid=%d,ppid=%d\n",getpid(),getppid());
    }
    return 0;
}


进程共享

父子进程之间在fork后。有哪些相同,哪些相异之处呢?
fork之后:

父子进程相同之处:全局变量、.data(数据块)、.text(代码块)、栈、堆、环境变量、用户ID、宿主目录、进程工作目录,信号处理方...
父子进程不同之处:进程ID、fork返回值、父进程ID、进程运行时间、闹钟、未解决信号集
那么子进程复制了父进程的用户空间内容,已经父进程的PCB,但pid不同。子进程每fork一次都要将父进程的地址空间完全拷贝一份,然后映射至物理内存吗?
答案是不是的。父子进程间遵循读时共享写时复制的原则,这样设计,无论子进程执行父进程的逻辑还是执行自己的逻辑都能节省内存开销。

关于全局变量,子进程虽然是也拥有同样的全局变量,但是父子进程的内存是独立的,所以不会有竞争问题
代码示例 父子进程不共享全局变量:

#include <stdio.h>
#include <unistd.h>

int var = 100;

int main()
{
    pid_t pid = fork();
    if(pid == 0){
        //son 
        var = 1001;
        printf("address = %d var = %d,child,pid=%d,ppid=%d\n",&var,var,getpid(),getppid());
        sleep(3);
        printf("address = %d var = %d,child,pid=%d,ppid=%d\n",&var,var,getpid(),getppid());
    }
    else if(pid > 0){
        //parent 
        sleep(1);//保障子进程能够修改var的值成功
        printf("address = %d var = %d,parent,pid=%d,ppid=%d\n",&var,var,getpid(),getppid());
        var=2000;
        printf("address = %d var = %d,parent,pid=%d,ppid=%d\n",&var,var,getpid(),getppid());
    }
    return 0;
}

相关文章

  • 进程api与控制

    进程创建 进程创建示例代码: 代码示例 用父进程创建N个子进程: 进程共享 父子进程之间在fork后。有哪些相同,...

  • 第二章 进程的描述与控制2

    2.2进程控制与同步 一、进程控制 1、进程控制的基本过程: 1)进程的创建 2)进程的终止 3)进程的阻塞与唤醒...

  • 线程的创建和控制

    线程的创建和控制 进程和线程的关系:进程提供资源,线程使用资源完成工作 创建线程函数 线程的控制 更多的API 创...

  • 网络复习-笔记04-Socket编程

    Socket编程—应用编程接口(API) 应用编程接口API:就是应用进程的控制权和操作系统的控制权进行转换的一个...

  • 操作系统第二章第二部分

    2.2进程控制 进程控制的基本过程: ¡进程的创建 ¡进程的终止 ¡进程的阻塞与唤醒 ¡进程的挂起和激活 1.进程...

  • 二.进程(2)进程控制

    2.2 进程控制 进程控制的基本过程: 进程的创建 进程的终止 进程的阻塞与唤醒 进程的挂起和激活 关于进程的亲属...

  • Linux下多进程编程API

    进程是Linux操作系统环境的基础,它控制着系统几乎所有的活动,下面介绍Linux下多进程的系统调用API。 fo...

  • 异常控制流

    异常控制流 7.1 进程与进程的上下文切换 程序和进程的概念 进程的逻辑控制流 进程的上下文切换 进程的私有地址空...

  • Web API控制器与MVC控制器的区别

    Web API控制器与MVC控制器的区别

  • Java多线程--线程及相关的Java API

    Java多线程--线程及相关的Java API 线程与进程 进程是线程的容器,程序是指令、数据的组织形式,进程是程...

网友评论

      本文标题:进程api与控制

      本文链接:https://www.haomeiwen.com/subject/egcoaqtx.html