linux操作系统-----Fork()函数

 目录

进程

fork()函数

        ps -ef命令的使用

top命令的使用

进程创建——fork()函数

例题一

例题二

例题三

进程

进程是操作系统中最重要的概念之一。在计算机系统中,进程不仅是最基本的并发执行单位,而且也是分配资源的基本单位。从进程观点出发,对计算机系统进行结构设计,也是软件开发的一种新技术。

        进程是对正在运行程序的抽象,其最基本的属性是动态性和并发性,我们将进程定义为程序在并发环境中的执行过程。程序是静态、被动的概念,本身可以作为一种软件资源长期保存。进程是程序的一次执行过程,是动态、主动的概念,有一定的生命周期,会动态的产生和消亡。

fork()函数

一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。

    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

        ps -ef命令的使用

UID:指用户的ID号,实际显示的是系统中的用户名

PID:该进程的ID

PPID:该进程的父进程的ID

C:该进程所占用CPU的百分比

STIME:进程被触发启动到现在的时间

TTY:该进程所运行的终端,若与终端无关,则显示“?”

TIME:该进程实际使用CPU运行的时间

CMD:命令的名称和参数。

top命令的使用

PID:进程的ID号,是进程的唯一标识符

USER:该进程的用户名

PR:进程的优先级,范围为0-39,优先数越小优先级越高

NI:指nice值,范围为-20~19,负值表示高优先级,正值表示底优先级。在topPR-NI=20。默认启动一个进程,nice值是0

VIRT:该进程占用的虚拟内存

RES:该进程占用的物理内存

SHR:该进行使用的共享内存

S:表示该进程的状态,S表示休眠,R表示正在运行

%CPU:从上一次更行到当前任务所占用CPU的百分比

%MEM:进程使用的物理内存和总内存的百分比

TIME+:该进程启动后占用总的CPU时间,即占用CPU使用时间的累加值,精确到百分之一秒

进程创建——fork()函数

fork()函数用来创建一个新进程。系统调用格式: 

 pid_t pid;

  pid=fork();

②如果fork()调用成功,它向父进程返回子进程的pid,并向子进程返回0fork()被调用了一次,但返回两次。此时操作系统在内存中创建一个新进程,所建的新进程是调用fork()父进程的副本,称为子进程。父进程与子进程并发执行。

③子进程完全复制了父进程地址空间的内容。当它并没有复制代码段,而是和父进程共用代码段,这样做是合理的。由于子进程可能执行不同的流程,会改变数据段和堆栈段,但是代码是只读的,不存在被修改的问题,因此,可以共用

例题一

每个进程输出ABC一次,要求共输出5ABC

#include<stdio.h>                                                                          
#include<unistd.h>
int main(){
        int p1;
        p1=fork();
        if(p1==0){
               fork();
               fork();
        }
        printf("ABC\n");
        while(1);
        return 0;
}

例题二

使用fork()创建两个子进程,实现当此程序执行时,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示输出内容,父进程为“A”,子进程分别为“B”和“C

#include<stdio.h>                                                                          
#include<unistd.h>
int main(){
        int p1;
        int i;
        for(i=0;i<2;i++){
        p1=fork();
        if(p1==0||p1==-1){
        break;
        }
        }
        if(p1==0){
                if(i==0){
                        printf("woshizijincheng1-----B\n");
                }
                if(i==1){
                        printf("woshizijincheng2-----C\n");
                }
        }else
        {
                printf("woshifujincheng1-----A\n");

        }
        return 0;
}

例题三

子进程创建之前:pid为1134

子进程创建之后:pid为1134,fork返回值为1135

子进程创建之后:pid为1135,fork返回值为0

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(){
    pid_t pid; //获得父进程pid
    printf("子进程创建之前:pid为%d\n", getpid());//创建子进程
    pid=fork();
    if(pid==-1){
        perror("fork() error!\n");
        exit(1);
    }
    //父进程返回子进程的pid,子进程返回0
    printf("子进程创建之后:pid为%d,fork返回值为%d\n", getpid(), pid);
    sleep(3);
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值