c语言中进程的基本概念

来源:互联网 发布:股票交易用什么软件 编辑:程序博客网 时间:2024/06/05 06:00
1. 进程 线程

进程: 程序的一次运行

程序  ----- 进程
程序:
   都是 可执行程序
   windows下:*.exe
   linux  下: ELF

进程  由程序转换过来的

程序---加载到内存--->进程
人    ----  人生
---------------------------

进程 理解成计算机 世界中的"人"

--------------------------------

程序的组成:

代码段 数据段 --- 冯诺依曼 VS 哈佛体系结构

|text|data|bss|

size ./a.out
text       data        bss        dec        hex    filename
1499        272          8       1779        6f3    ../6-day/a.out

进程的组成:
text | data | bss | 堆 栈 | 系统数据|
                  (malloc)

程序: 磁盘上 静态
进程:  内存中 动态

进程号:PID(process id) ---唯一表示一个进程
linux如何去描述一个进程(编程的角度)
struct task_struct
{

}

描述一个进程相关信息:
pid
ppid(Parent Process ID) 父进程id号

linux下进程的命令:
who
ps

//进程的状态:
D    uninterruptible sleep (usually IO) //不可中断 的 睡眠态(等待态)
R    running or runnable (on run queue) //执行态 或者 是就绪态
S    interruptible sleep (waiting for an event to complete) //可中断的睡眠态
T    stopped, either by a job control signal or because it is being traced. //停止态--(中止态)--暂停态
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent.
     //僵尸态 --死亡啦,但是没有被父进程收尸
     //
     //

top 命令: 类似于 Windows下 "任务管理器"
top -p [pid] 查看某个进程的状态信息


kill 给对应的进程发信号:
kill -l //查看系统中的信号列表
kill -19 [pid] //发停止信号
kill -18 [pid] //发恢复信号
----------------------------------------------------
命令:
[1]. 只能看到进程的某一时刻的信息(快照)
ps -ef | grep 程序名   //查看进程的 信息 主要 pid 和 ppid 号
ps aux | grep 程序名   //查看进程的状态信息

[2].
  top   //动态的查看进程的信息

  top -p [pid] //-p 表示指定 pid号

[3].kill 命令
    kill 给对应的进程发信号:
    kill -l //查看系统中的信号列表
    kill -19 [pid] //发停止信号
    kill -18 [pid] //发恢复信号

    kill -9  [pid] //杀死进程
    killall -9 [程序名] //杀死 "程序名"指定的进程
[4].pstree
    
   查看进程的关系
   pstree -sp [pid] //查看 指定的pid的进程的关系

练习:
自己写个死循环,通过命令查看进程的pid 状态信息 发信号暂停程序,
恢复程序和结束程序

进程的生命周期:
[1].诞生
[2].进程执行
[3].进程结束


1.进程的诞生
[1].fork() // fork 叉子
  注:
    fork创建子进程的过程
    [1].通过复制调用fork的进程 来实现新进程的创建
        新进程是调用进程的复制品
        新进程被称为 "子进程"
        原先的调用进程 称为 "父进程"

    [2].复制了哪些东西?
        a.原先进程中有哪些东西?
          |text | data | bss | 堆 栈 | 系统数据|
        复制之后:
        新的进程获得了一份原先进程的组成的各个部分
          |text | data | bss | 堆 栈 | 系统数据|

        b.梳理:
          代码段 和 数据段
       
        c.拷贝了一些寄存器的值
          pc (Program Counter) //指向下一条要执行的指令


#include <unistd.h>
pid_t fork(void);
返回值:
   成功  在父进程 中返回子进程的pid
         在子进程 中返回0
   失败  -1 &errno
       
         
注意:
1.fork 之后父子进程的运行顺序,不确定的 ,是有操作系统决定的
2.父子进程是独立的地址空间,相互之间不会有影响!

全局变量
静态变量 static
局部变量
--------------
栈上
堆上--->malloc


练习:
分别定义上面不同的变量,赋值进程进行不同的操作,观察结果


#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
    pid_t pid; //pid_t <==>int
     
    pid = fork(); //创建子进程 --- pc 程序计数器
                  // 创建子进程时,子进程也拷贝了父进程的pc值
                  // 指向了fork之后的下一条语句
                  // 此处 fork 之后的下一句为
                  // 赋值语句
                  //  将:fork的返回值赋值给pid变量
    if(pid < 0) //出错处理
    {
        perror("fork fail");
        return -1;
    }
    if(pid > 0) // 父进程执行的代码部分
    {
      //  while(1)
        {
            printf("father pid = %d ppid = %d\n",getpid(),getppid());
            sleep(1);
        }
    } else if(pid == 0) // 子进程执行的代码部分
    {
      //  while(1)
        {
            printf("child pid = %d ppid = %d\n",getpid(),getppid());
      //      sleep(1);
        }

    }
   
    printf("fork test\n"); //这句话 在没有 上面的while(1)时 会打印两次 ,一次是在父进程中
                           //一次是在 子进程中
                           //

    return 0;
}

0 0
原创粉丝点击