linux进程复习笔记

一.进程就是一个运行着一个或多个线程的地址空间加上所需的资源。他由代码,数据,变量(占用着系统内存),打开的文件描述符和环境组成。

二.普通进程pid由2到32768,init进程pid是1 ,他是所有进程的祖先,负责管理其他进程。

三.进程结构

进程neil和rick共享grep代码和C库函数,这两段代码被以只读方式从磁盘加载到内存中,可以被多个进程共享。

两个进程的数据段和文件描述符都是私有的,他们有自己的栈空间。

四.init进程在系统启动后第一个被运行,用于管理其他进程。根据进程的优先级分配时间片,当某个进程的时间片用完后,系统强行收回资源分给下一个等待的进程。

暂停等待输入的程序,执行其他程序比让程序不断轮询要好,表现良好的程序为nice程序,nice值越大,优先级越低。

5.使用system()启动一个进程,需要先启动一个shell,因此对安装shell的环境依赖很大,所以使用system调用的效率并不高。

6.使用exec簇的函数可以启动新的进程,它继承了原进程已打开的文件描述符,已定义的变量等特征。它能解决5所提到的问题,但会覆盖原进程。

7.复制进程:要想让程序同时执行多个函数,可以用线程,或者从原进程复制一个完全分离的进程。后者用fork()调用实现。

父进程中的fork()返回新的子进程的pid,而子进程中fork()返回0,我们可以据此区别父子进程

8.等待一个进程

用fork()启动一个进程后,子进程就有了它自己的生命周期并独立运行,有时我们希望知道子进程什么时候结束。通过wait()函数实现。

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *stat_loc)

wait调用暂停父进程直到子进程结束,它返回子进程的pid。参数所带的状态信息使得我们能够知道子进程的退出状态--即子进程main的返回码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    int n = 0;
    int exit_code;
    char *msg;

    pid_t new_pid;    
    new_pid = fork();
    switch(new_pid)
    {
        case -1:
            perror("fork failed \n");
            break;
        case 0:
            msg = "This is child ";
            n = 8;
            exit_code = 37;
            break;
        default:
            msg = "This is parent ";
            n = 3;
            exit_code = 0;
    }
    
    for(; n > 0; n--)
    {
        puts(msg);
        sleep(1);
    }
    
    if(new_pid != 0)
    {
        pid_t child_pid;
        int stat_val;
        child_pid = wait(&stat_val);
        
        printf("child pid is %d \n", child_pid);
        if(WIFEXITED(stat_val))
        {
            printf("child exited with code %d \n", WEXITSTATUS(stat_val));
        }
        else
        {
            printf("child treminate abnormally\n");
        }
        
    }

    return exit_code;
}

9.僵尸进程

子进程终止后,进程表中相应的进程项并没有释放,直到父进程也正常结束。如果在这个过程中父进程发生异常,那么这个子进程会一直存在进程表中。这样的进程称之为僵尸进程,僵尸进程会一直占用系统资源。

进程表的容量是有限的,过多的进程会导致进程表查询速度变慢,且如果进程表占满后,就不能启动新进程,因此需要避免僵尸进程出现。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值