linux学习之八---Linux进程基础知识

时间:2023-07-12 15:35:32

一、linux进程

linux是一个多用户多任务的操作系统。

多用户是指多个用户能够在同一时间使用计算机。

多任务是指linux能够同一时候运行几个任务。

进程简单来说就是执行中的程序,Linux系统的一个重要特点是能够同一时候启动多个进程。依据操作系统的定义:进程是操作系统资源管理的最小单位。

1.Linux进程的概念

进程是一个动态的实体,是程序一次运行过程,而且进程是操作系统资源分配的基本单位。

进程与程序的差别:进程是动态的,程序是静态的。进程是执行中的程序,而程序还是保存在硬盘上的可执行代码。

进程与线程的差别:为了让计算机在同一时间内能运行很多其它任务,在进程内部又划分了很多线程。线程是在进程内部,比进程更小而且能独立运行的基本单元。进程在运行过程拥有独立的内存单元,可是线程基本上不拥有系统资源,它与同属一个进程的其它线程共享进程拥有的所有资源。

2.Linux进程的标志

Linux操作系统中,每一个进程都是通过唯一的进程ID标识的。

进程ID是一个非负数,每一个进程除了进程ID外另一些其它标识信息。它们都能够通过对应的函数获得。函数声明在unistd.h头文件里。

getpid():获得进程ID

getppid():获得进程父进程的ID

getuid():获得进程实际用户ID

geteuid():获得进程有效用户ID

getgid():获得进程实际组ID

getegid():获得进程有效组ID

3.Linux进程的结构

Linux中的一个进程由3个部分组成:代码段、数据段、堆栈段。

代码段:存放程序的可运行代码。

数据段:存放程序的全局变量、常量、静态变量。

堆栈段中的堆区:存放动态分配的内存变量。

堆栈段中的栈区:用于函数调用,它存放着函数的參数、函数内部定义的局部变量。

4.Linux进程的状态

执行状态:进程正在执行或iozai执行队列中等待执行。

可中断等待状态:进程正在等待某个事件完毕。

等待过程中能够被信号或定时器唤醒。

不可中断等待状态:进程正在等待某个事件完毕。等待过程中不能够被信号或定时器唤醒,必须等待直到等待的事件发生。

僵死状态:进程已终止。但进程描写叙述符依旧存在,直到父进程调用wait()函数后释放。

停止状态:进程因收到SIGSTOP、SIGSTP、SIGTIN、SIGTOU信号后停止执行或者该进程正在被跟踪(调试程序时。进程处于被跟踪状态)。

5.Linux进程的控制

Linux进程控制包含创建进程、运行新程序、退出进程以及改变进程优先级等。

fork:用于创建一个新进程。

exit:用于终止进程。

exec:用于运行一个应用程序。

wait:将父进程挂起。等待子进程终止。

getpid:获取当前进程的进程ID。

nice:改变进程的优先级。

二、创建进程

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h> int main()
{
pid_t pid; printf("Process Creation Study\n");
pid=fork();
switch(pid)
{
case 0:
printf("Child process is tunning,CurPid is %d,ParentPid is %d\n",
pid,getppid());
break;
case -1:
printf("Process creation failed\n");
break;
default:
printf("Parent process is running,ChildPid is %d,ParentPid is %d\n",
pid,getpid());
break;
}
exit(0);
return 0;
}

普通情况下,函数最多有一个返回值。但fork函数很特殊,它有两个返回值,即调用一次返回两次。成功调用fork函数后,当前进程实际上已经分裂成两个进程,一个是原来的父进程,还有一个是刚刚创建的子进程。父进程在调用fork函数的地方分开。fork函数有两个返回值。一个是父进程调用fork函数后的返回值,该返回值是刚刚创建子进程的ID。还有一个是子进程中fork函数的返回值。该返回值是0。

fork返回两次的前提是进程创建成功,假设进程创建失败,则仅仅返回-1。

linux学习之八---Linux进程基础知识

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFuemhpaHVpXzEwMDg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

由图可见。以上两次执行结果都算父进程先执行。一般来说,fork之后是父进程先执行还是子进程先执行是不确定的。这取决于内核所使用的调度算法。

父进程调用fork函数后的返回值是刚刚创建子进程的ID(3465),通过getpid函数得到父进程ID(3464)。

子进程调用fork函数后的返回值是0,子进程通过getppid函数得到父进程ID(3464)。