1.进程的概念
- 概念
程序是指编译过的可执行的二进制代码,再大点可以叫应用。进程是指正在运行的程序,一个程序可以有多个进程,一个进程中可以有多个线程。
输入命令 top可以看到pid一直在刷新
2,进程ID
-
概念
每一个进程都有一个唯一的标识符,进程 ID 简称 pid。
进程的 ID 在一个固定的时刻是唯一的,需要注意的是,假如你在 s 秒的时候有一个进程 ID
是 1000,在另外一个时刻 s+n,另一个进程 ID 也有可能是 1000。
另外内核运行的第一个进程是 1,也就是内核的 init 程序,这个是唯一的。
进程 id 一般默认的最大值为 32768,不过也是可以修改的,当然一般情况下不需要这么做。
如果当前进程是 1000,那么下一个分配的进程就是 1001,它是严格线性分配的。直到 pid 到
了最大值,才重新分配已经用过的进程 ID,当然这些进程都是已经死亡的进程。
除了 init 进程,其它进程都是由其它进程创立的。创立新进程的进程叫父进程,新进程叫
子进程。 -
函数
pid_t getpid(void); 参数:无。 返回值:成功返回进程号。
pid_t getppid(void); 参数:无。 返回值:成功返回父进程。
-
实验例程
#include <stdio.h> #include <sys/types.h> #include <unistd.h> void main() { pid_t idp,id; idp = getppid(); printf("ppid = %d\n",idp); id = getpid(); printf("pid = %d\n",id); }
-
在ubuntu下编译,加载到开发板运行
可以看到当前进程号和父进程号 -
进程有两个命令,ps和kill分别是查看和终止进程
3.exex函数族 - 执行新程序
- 介绍
在 linux 中,exec 函数族是把程序直接载入内存,而不是在一个程序中运行多个进程。exec 函数族调用成功之后,会在内存中执行一个新的程序。在 linux 中要运行多任务需要使用 exec 函数族和 fork 进程。 - 有六个exec函数
首先函数族都是以 exec+xx 的方式命名的。
“l”和“v”表示参数是以列表还是以数组的方式提供的。
“p”表示这个函数的第一个参数是*path,就是以绝对路径来提供程序的路径,也可以以
当前目录作为目标。
“e”表示为程序提供新的环境变量。 - 例程
execl.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <unistd.h>
//exec函数族
int main(void)
{
if(execl("/mnt/udisk/helloexec","helloexec","execl",NULL) == -1){
perror("execl error");
exit(1);
}
//程序已经跳转走,如果正常execl不反回错误,下面的代码不会执行!
printf("execl error!\n");
return 0;
}
helloexex.c
#include <stdio.h>
int main(int arc,char *argv[])
{
printf("Hello %s!\n",argv[1]);
}
- 在ubuntu下编译,加载到开发板运行
4.fork 创建新进程
- 在 linux 中可以使用 fork 创建和当前进程一样的进程,新的进程叫子进程,原来的进程叫
父进程。 - pid_t fork(void);
参数:无
返回值:执行成功,子进程 pid 返回给父进程,0 返回给子进程;出现错误-1,返回给父
进程。 - 例程
#include <stdio.h>
#include <unistd.h>
main()
{
pid_t pid;
int i=100;
pid = fork();
//调用出错
if(pid == -1){
printf("fork failed\n");
return 1;
}
//返回给父进程子进程号,返回值大于0
else if(pid){
i++;
printf("\nThe father i = %d\n",i);
printf("The father return value is %d\n",pid);
printf("The father pid is %d\n",getpid());
printf("The father ppid is %d\n",getppid());
while(1);
}
//返回子进程0,返回值等于0返回给子进程
else{
i++;
printf("\nThe child i = %d\n",i);
printf("The child return value is %d\n",pid);
printf("The child pid is %d\n",getpid());
printf("The child ppid is %d\n",getppid());
while(1);
}
return 0;
}
5.进程终止 exit
- 在 main 函数的结尾会使用 return 或者exit 结束程序。当使用 exit 的时候,就是使用的进程终止函数 exit。
- void exit(int status)
参数:返回给父进程的参数。
返回值:无