栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言学习笔记(四):进程

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言学习笔记(四):进程

目录

1.程序

2.程序的执行方式

3. 进程

4. 程序与进程

5.进程的状态

6.Linux进程地址空间布局

7. Linux下进程相关的API函数

 8. 示例代码:

       


1.程序

程序 = 数据结构 + 算法
    
    数据:用来表示人们思维对象的抽象概念的物理表现叫做数据
    数据处理的规则叫做操作(指令)
    
    对某一有限数据的集合所实施的,目的在于解决某一个问题的一组有限的指令的集合称为一个计算
    计算机就是用指令来进行计算(处理数据)


      程序就是数据和指令的集合,一个程序的执行过程就是一个计算

2.程序的执行方式

(1)顺序执行
        一个程序完全执行完毕之后,才能执行下一个程序
            假如:
                一个程序分为四个步骤
                    1.输入数据  ==》 2. 发送给对方  ==》 3.接收对方的数据 ==》4.结束通信        
    
        缺点:
            CPU利用率低
            
    (2)并发执行
            为了提高CPU的利用率,吞吐量提高
            现代操作系统为了能够让程序并发执行,特地的引入了“进程”的概念。

3. 进程

        进程是具有独立功能的程序关于某个数据集合上的一次运行活动

4. 程序与进程

(1)进程是动态的概念,程序是静态的概念
(2)进程是一个独立的活动单位
         进程是竞争系统资源的基本单位
(3)一个程序可以对应多个进程

5.进程的状态

        就绪态
        执行态
        阻塞态(等待)

6.Linux进程地址空间布局

Linux对进程的数据进行分段管理,不同的数据存储在不同的“内存段”
    不同的“内存段”数据及管理方法不一样
    
    .init :用来存储系统给每一个执行程序自动添加的“初始化”代码
    
    .text : 主要存放用户代码
            只读并且共享,这段内存在程序运行期间不会释放
            
        
    .bss :数据段
          主要存放程序未初始化的全局变量和未初始化的static变量
            可读可写,这段内存在程序运行期间一直存在
            .bss ,在进程初始化的时候 (可能)全局初始化为0
            
    .data :数据段
            主要存放程序已初始化的全局变量和已初始化的static变量
            可读可写,这段内存在程序运行期间一直存在
    
    .rodata:只读数据段
            主要存放程序中的只读数据
            

    栈空间(stack):    
            主要存放局部变量
            可读可写,这段空间自动释放(代码块指定完毕,代码块中的局部变量空间就会自动释放)
            
            
    堆空间:自由内存,在这个区域定义和释放变量完全由用户决定
            主要是malloc/realloc/calloc 动态分配空间
            可读可写,这段内存在程序运行期间一直存在,直到你手动free

7. Linux下进程相关的API函数

(1)创建一个新进程
                fork
        NAME
       fork - create a child process

SYNOPSIS
       #include
       #include
        fork是用来创建一个子进程,要创建一个进程,首先得知道一个进程里面包含什么东西?
                        数据(用户数据和系统数据) + 指令
                创建一个新进程的时候,新进程的数据和指令 来源于父进程
                fork这个函数在创建子进程时候,把父进程的数据和指令拷贝
                        父进程的变量,数据对象
                        标准IO缓冲区
                        文件描述符
                        ...
                        一旦拷贝完毕,父子进程独立
            也就相当于fork成功就会有两个进程在执行当前的代码
        所以为了区分父子进程,fork调用一次又两次返回
                一次是父进程返回
                一次是子进程返回
                
        pid_t 是用来描述进程ID
       pid_t fork(void);
       
            返回值:
                    成功 :
                            父进程返回  子进程的pid( >0 )
                            子进程返回   0
    
                    失败返回-1.同时errno被设置
                    
        ==============
        fork的伪代码
        pid_t fork()
        {
            clone();//拷贝,一旦成功,就会有两个进程往下执行
                    父进程  子进程    
            
            if(父进程)
            {
                return 子进程的pid(>0)
            }
            else if(子进程)
            {
                return 0;
            }
        }


       8. 示例代码:
#include 
#include 
#include 
#include 
#include 

int main()
{
	printf("hello,world");
	int a = 6;
	a++;
	printf("%dn",getpid());
	pid_t pid = fork();
	if(pid == -1)
	{
		perror("fork error:");
		return -1;
	}
	else if(pid == 0)//子进程
	{	
		printf("son :%dn",getpid());
		printf("father_son :%dn",getppid());
		//printf("son : a = %dn",a);
		printf("hello,sonn");
		exit(-2);
	}
	else //父进程
	{
		a++;
		int statu;
		wait(&statu);
		if(WIFEXITED(statu))
		{
		
			printf("WEXITSTATUS(status) = %un",WEXITSTATUS(statu));
			
		}
		printf("father :%dn",getpid());
		printf("father_father :%dn",getppid());
		//printf("father:a = %dn",a);
		printf("hello,fathern");
	}

	printf("we are familyn");
}


    

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/991033.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号