LINUX是一个多任务的操作系统,在同一个时间里,系统运行了多个进程。
但本质上LINUX系统一次只能运行一个程序。
LINUX系统运用的是一种叫进程调度的方式:在众多进程中选一个进程运行,其他进程等待。当它运行时间结束后换其他程序。每个程序运行时间很短,造成了系统在运行多个程序的错觉。
使用 TOP命令来看当前系统下的进程
PID 进程ID,用来区分进程
SUER 启动进程的用户ID
PR 动态优先级priority
NI 静态优先级nice,取值范围-20到19;值越低,占CPU能力越强,优先级越高
VIRT 占内存大小
RES 使用内存大小
SHR 共享内存大小
S 进程状态s睡眠 r运行 z僵尸进程
%cpu 占cpu时间百分比
%MEM 占用物理内存百分比
TIME+ 使用cpu时间总计
COMMAND 命令名
或者是ps -ef
其中PPID代表该进程的父进程
STIME是进程启动的时间
TTY 控制终端的ID
当我们要终止一个进程时可以使用 kill命令
kill PID
有时候一个程序下会有多个PID 则使用 killall
killall 程序名
而获取该程序的PID可以在程序中添加 getppid()头文件是#include<unistd.h>
getppid()函数会返回该程序的PID
在一个程序下面创建一个子进程可以用 fork()头文件是#include<sys/types.h>#include<unistd.h>
fork()在子进程里返回的值是0;而在父进程返回的值是他的PID; 它的返回值我们可以定义一个进程变量来接受
pid_t a=fork();
可能不太好理解,举个例子
源代码:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
pid_t a;
int b=0,c=0;
a=fork();
printf ( "第一处的PID是%d\n",getppid() );
if ( 0!=a )
{
a=1;
printf ( "我是父进程,我的PID是%d,a=%d,b=%d\n",getppid(),a,b );
}
else
{
b=1;
printf ( "我是子进程,我的PID是%d,a=%d,b=%d\n",getppid(),a,b );
}
printf ( "最后一处的PID是%d\n",getppid() );
return 0;
}
运行结果
可以看到该源代码出现了二个进程。
并且父进程的代码和子进程的代码相同;
因此他具有良好的并发性;
但是在fork() 创建之前,父进程的内存共享给子进程;之后,他俩对变量进行的修改或定义新的变量互不干扰;
而另一个创建子进程的函数vfork(),不同于fork(),
它的子进程与父进程在同一个地址空间,因此在子进程中对变量进行修改会影响父进程;
并且vfork()创建子进程,调用它时结尾必须调用exit(0)结束,否则子进程将不能结束;(虽然不会出现僵尸程序,但会提示段错误)
在这里扩展一个函数 execl() 头文件#include<unistd.h>
它的作用是在程序里打开一个可执行程序
用法: execl( “路径”,“参数 (没有可以不写)“,(char *)0)
例子: execl ( "/home/17712/1",(char *)0)17712目录下的1是个可执行程序