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;
}
鉴于本人才疏学浅,所以其中不免有遗漏或者错误,恳请各位博友批评指正。
原文地址:https://www.cnblogs.com/wurenzhong/p/7289864.html