LLINUX_C编程实战-第七章《进程管理》学习笔记

  1. 进程和程序的区别:进程是操作系统分配资源的最小单元;进程是动态的,程序存在硬盘上为静态的;简而言之,进程是运行的程序。

  2. 进程的内存映像:操作系统将可执行程序复制到内存地址中,内存地址从低到高依次是:
    代码段:二进制机器代码
    数据段:存放被初始化的全局变量,初始化的静态变量,字符串常量
    未初始化数据段(BSS段): 未被初始化的静态变量和全局变量;内核会将此段中的数据初始化为0或NULL;
    堆区:由malloc(c语言中)分配的动态内存的变量
    栈区:存放函数返回值,入参,局部变量(自动变量)

  3. 进程的创建:fork() 和 vfork() 的区别
    第一点:父子进程的执行顺序不同;fork()函数创建的父子进程的执行由使用机器的系统决定;vfork()函数所创建出的父进程处于阻塞态,仅当子进程调用exit or execl函数组时,父进程才恢复执行;
    第二点:创建的地址空间不同; fork()函数的子进程复制父进程的地址空间,即共享代码段,复制数据段,堆栈段;vfork()函数的子进程和父进程共享地址空间ps: 对vfork()创建的子进程改变变量时会造成父进程中变量的改变,因此操作时要格外小心;vfork比fork更加节省资源。

  4. 孤儿进程概念:父进程先于子进程结束,此时子进程就变为孤儿进程,由init进程收养。

  5. 进程的退出:exit( error_code ) ,return 为正常退出; about(),或收到某个信号 使进程异常退出。

  6. 执行新的程序:execv函数簇

  7. 等待函数wait 和 waitpid : 父进程调用等待函数,防止子进程先于父进程结束而进入僵尸态;

    wait (&statloc),其中statloc指向进程的退出码,可以为null;返回值为退出子进程的PID;可检查终止状态的

if( pid != 0)
    {
        child_pid = wait( &statloc );
        printf( "child process %d has exited\n", child_pid );
        if( WIFEXITED( statloc))
        {
            printf( "child process sucess\n");
        }

waitpid,**d( pid, &statloc, options) : 等待特定进程的退出;options为WNOHANG,则父进程不被挂起而立即返回并执行其后的代码。
周期性的检查摸个特定子进程是否退出: pid = waitpid( child_pid,null,WNOHANG);返回0表示子进程尚未退出;返回子进程ID表示子进程已经结束;调用失败返回-1;
`

猜你喜欢

转载自blog.csdn.net/caozhigang129/article/details/78065553