操作系统--基于Linux的进程的并发执行2(超详细/设计/实验/作业/练习)

本文介绍了操作系统原理,特别是Linux环境下进程的并发执行。通过分析C语言中的fork()函数,解释了如何创建子进程以及进程间的资源继承。同时,文章提供了多个示例代码(如Fork1.c到Fork4.c)来演示并发执行的过程,并指出printf在并发环境下的行为特点。
摘要由CSDN通过智能技术生成

课程名:操作系统原理及Linux应用

内容/作用:设计/实验/作业/练习

学习:基于Linux的进程的并发执行2

一、前言

  1. 理解并发进程的基本概念和执行特征
  2. 理解进程的资源继承和并发执行。
  3. 理解进程的资源竞争和互斥实现。

二、环境与设备

1.软件:虚拟机VMware
2.环境:Linux系统环境

三、原理

   1,下面这个C程序展示了UNIX系统中父进程创建子进程及各自分开活动的情况。

fork( )

创建一个新进程。
系统调用格式:

pid=fork( )

参数定义:

int fork( )

fork( )返回值意义如下:

0:在子进程中,pid变量保存的fork( )返回值为0,表示当前进程是子进程。
>0:在父进程中,pid变量保存的fork( )返回值为子进程的id值(进程唯一标识符)-1:创建失败。
如果fork( )调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork( )被调用了一次,但返回了两次。此时OS在内存中建立一个新进程,所建的新进程是调用fork( )父进程(parent process)的副本,称为子进程(child process)。子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。父进程与子进程并发执行。

四、内容

   1,代码:

Fork1.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
    pid_tfpid;
    int count=0;
    fpid=fork();
    if(fpid<0)
        printf("error in fork!");
    else if(fpid==0)
    {
        printf("I am the child process,my process id is %d\n");
        printf("我是爹的儿子\n");
        count++;
    }
    else
    {
        printf("I am process,my process id is %d\n");
        printf("我是孩子他爹\n");
        count++;
    }
    printf("统计结果是:%d\n,count");
    return 0;
    
}

Fork2.c
#include<unistd.h>
#include<stdio.h>
int main()
{
    int p;
    p=fork();
    if(p==0)
    {
        putchar('b');
    }
    else
    {
        p=fork();
        if(p==0)
            putchar('c');
        else
            putchar('a');
            
    }
    printf("\n");
    return 0;
    
}

Fork3,c
#include<unistd.h。
#include<stdio.h>
int main()
{
    int p;
    printf("This is parent(pid=%d) process \n",getpid());
    p=fork();
    if(p==0)
        printf("This id child1(pid=%d) process:b\n",getpid());
    else
    {
        p=fork()if(p==0)
            printf("This is child2(pid=%d) process :\n",getpid());
        
    }
    printf("\n");
    return 0;
}

Fork4.C 
#include<unistd.h>
#include<stdio.h>
int main()
{
    int i;
    printf("I son/pa ppos pid fpid\n");
    for(i=o;i<2,i++)
    {
        pid_tfpid=fork();
        if(fpid==0)
            printf("%d child %4d %4d %4d\n",i,getppid(),getpid(),fpid());
        else
        {
            printf("%d parent %4d %4d %4d\n",i,getppid(),getpid(),fpid());
        
        }
        return 0;
    }
}

五、总结与分析

   1,printf某些内容时,操作系统仅仅是把该内容放到了缓冲队列里,并没有实际显示到屏幕上。因此fork 后,子进程得到这份拷贝。而当printf中含有\n时, printf将刷新,因此子进程无法得到这份拷贝,fork也就只输出一次了。因此程序输出结果不管是子进程还是父进程前面都带有,而程序B只有当父进程执行时才会输出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员老茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值