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 <sys/types.h>
       #include <unistd.h>
        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 <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

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

	printf("we are family\n");
}


    
   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值