zoukankan      html  css  js  c++  java
  • linux进程

    今天总结了一下学到的关于linux中进程的相关知识,下面是总结内容,希望对你帮助

                       

    一、当ELF格式的程序执行时,内核就产生一个名为task_struct{}的结构体来表示这个进程,这个结构体
    包括了进程的内存资源、CPU资源、文件、信号、各种锁资源等。

    二、task_struct{}结构体的目录:/usr/src/linux-headers-3.5.0-23/include/linux/sched.h

    三、查看进程的命令:ps -ef
    例子:
    UID PID PPID C STIME TTY TIME CMD
    root 1 0 0 06:06 ? 00:00:00 /sbin/init
    root 2 0 0 06:06 ? 00:00:00 [kthreadd]
    root 3 2 0 06:06 ? 00:00:01 [ksoftirqd/0]
    root 6 2 0 06:06 ? 00:00:00 [migration/0]
    root 7 2 0 06:06 ? 00:00:00 [watchdog/0]
    root 8 2 0 06:06 ? 00:00:00 [cpuset]
    root 9 2 0 06:06 ? 00:00:00 [khelper]
    root 10 2 0 06:06 ? 00:00:00 [kdevtmpfs]
    root 11 2 0 06:06 ? 00:00:00 [netns]
    root 12 2 0 06:06 ? 00:00:00 [sync_supers]
    root 13 2 0 06:06 ? 00:00:00 [bdi-default]
    root 14 2 0 06:06 ? 00:00:00 [kintegrityd]
    root 15 2 0 06:06 ? 00:00:00 [kblockd]


    四、查看进程关系的命令:pstree
    例子:
    init─┬─NetworkManager───{NetworkManager}
    ├─accounts-daemon───{accounts-daemon}
    ├─acpid
    ├─atd
    ├─avahi-daemon───avahi-daemon
    ├─bluetoothd
    ├─colord───2*[{colord}]
    ├─console-kit-dae───64*[{console-kit-dae}]
    ├─cron
    ├─cupsd
    ├─2*[dbus-daemon]
    ├─dbus-launch
    ├─dconf-service───2*[{dconf-service}]
    ├─gconfd-2
    ├─geoclue-master
    ├─6*[getty]
    ├─gnome-keyring-d───6*[{gnome-keyring-d}]
    ├─gnome-terminal─┬─bash───pstree
    │ ├─gnome-pty-helpe

    可以看到大家都有一个共同的祖先:init,这个进程是没有父进程的,在子进程的父进程先退出之后,子进程
    由init(祖先进程)收养

    五、进程的创建
    1、 创建一个进程:fork()  查看命令:man 2 fork

    2、 头文件:#include(unistd.h)

    3、函数原型: pid_t fork(void);
    a、pid_t:进程PID号类型
    b、void:不需要传递任何参数

    4、返回值:
    成功: 父进程中返回子进程的PID号(非零数),子进程中返回0
    失败:返回-1,进程不会创建出来

    5、当执行fork(),子进程和父进程执行的顺序是随机的

    6、fork后子进程会继承父进程大部分的属性,包括信号阻塞掩码


    六、进程的退出
    (1)
    1、头文件:#include <stdlib.h>

    2、函数原型: void exit(int status);  查看命令:man 3 exit
    a、status:正常退出:0
                       异常退出:非0

    3、执行exit先冲洗缓冲区数据,关闭打开的文件,然后在退出进程


    (2)
    1、头文件:#include <unistd.h>

    2、函数原型: void _exit(int status);
    a、status:正常退出:0
                       异常退出:非0

    3、直接走人,不会冲洗缓冲区,也不会关闭打开的文件(简单粗暴,说走就走)


    两个函数都没有返回值


    七、回收子进程资源

    1、头文件: #include <sys/types.h>
                        #include <sys/wait.h>

    2、函数原型: pid_t wait(int *status);
    a、status:监听子进程退出状态的变量指针

    3、返回值:
    成功:退出进程的PID号
    失败:-1

    4、特点:会一直阻塞,直到子进程退出为止


    八、获取进程的PID号
    1、头文件: #include <sys/types.h>
                        #include <unistd.h>
    2、函数原型: pid_t getpid(void); 获取自身的PID号

    3、函数原型: pid_t getppid(void); 获取父进程的PID号

    九、话多说直接上代码:
    #include<stdio.h>
    #include<unistd.h>
    #include<wait.h>
    #include<stdlib.h>
    #include<sys/types.h>
    #include<errno.h>
    
    int main(int argc,char**argv)
    {
        pid_t pid; //pid用来存放进程的PID号
        
        int status;//进程退出时用
        
        pid = fork();//创建一个子进程,父进程中返回子进程的PID值(非0的数),子进程中返回0
        
        if(pid == -1) //创建进程失败
        {
            perror("fork");
            exit(1); //异常退出
        }
        
        if(pid != 0) //父进程
        {
            wait(&status);//阻塞,一直等到子进程退出为止,子进程正常退出为0,异常为非0
            printf("I am fathre process ,my PID is [%d]
    ",getpid());
            printf("%d
    ",status);//看看子进程是正常退出还是异常退出
        }
        
        if(pid == 0)//子进程
        {
            printf("I am child process,my PID is [%d],and my fathre PID is [%d]
    ",getpid(),getppid());
    
            exit(0);//正常退出为0,异常退出为非0 
        }
        
        return 0;
    }
    鉴于本人才疏学浅,所以其中不免有遗漏或者错误,恳请各位博友批评指正。
  • 相关阅读:
    LAMP 环境搭建备忘 -- Linux的安装(一)
    Qt 的一些浅知识点
    chm 转 txt
    SQL 语句 (二) --- SELECT
    SQL语句 (一)
    量子电路
    量子隐形传态 Quantum Teleportation
    量子逻辑门
    量子纠缠2——CHSH不等式
    量子纠缠1——量子比特、Bell态、EPR佯谬
  • 原文地址:https://www.cnblogs.com/wurenzhong/p/7289864.html
Copyright © 2011-2022 走看看