一、什么是进程
进程是一个具有一定独立功能的程序的一次性的活动,
具有的特点:动态(与程序(静态)的区别)、并发(多进程同时进行)、独立、异步。
理解:linux 的多任务操作系统
PS:
Linux是一个多任务的操作系统,也就是说,在同一个时间内,可以有多个进程同时执行。如果读者对计算机硬件体系有一定了解的话,会知道我们大家常用的单CPU计算机实际上在一个时间片断内只能执行一条指令,那么Linux是如何实现多进程同时执行的呢?原来Linux使用了一种称为“进程调度(process scheduling)”的手段,首先,为每个进程指派一定的运行时间,这个时间通常很短,短到以毫秒为单位,然后依照某种规则,从众多进程中挑选一个投入运行,其他的进程暂时等待,当正在运行的那个进程时间耗尽,或执行完毕退出,或因某种原因暂停,Linux就会重新进行调度,挑选下一个进程投入运行。因为每个进程占用的时间片都很短,在我们使用者的角度来看,就好像多个进程同时运行一样了。
在Linux中,每个进程在创建时都会被分配一个数据结构,称为进程控制块(Process Control Block,简称PCB)。PCB中包含了很多重要的信息,供系统调度和进程本身执行使用,其中最重要的莫过于进程ID(process ID)了,进程ID也被称作进程标识符,是一个非负的整数,在Linux操作系统中唯一地标志一个进程,在我们最常使用的I386架构(即PC使用的架构)上,一个非负的整数的变化范围是0-32767,这也是我们所有可能取到的进程ID。其实从进程ID的名字就可以看出,它就是进程的身份证号码,每个人的身份证号码都不会相同,每个进程的进程ID也不会相同。
一个或多个进程可以合起来构成一个进程组(process group),一个或多个进程组可以合起来构成一个会话(session)。这样我们就有了对进程进行批量操作的能力,比如通过向某个进程组发送信号来实现向该组中的每个进程发送信号。
查看进程:ps、ps -al 、ps aux等命令。杀死进程:kill PID
二、进程三态:
三、进程概念
进程ID、父进程PPID、子进程PID、进程互斥、临界资源、进程同步、进程调度、调度算法(优先级、时间轮转法、短进程优先、等)、死锁现象
四、进程的程序设计
4.1 获取ID #include<sys/types.h>
#include<unistd.h>
pid_t getpid() //获取进程号
示例代码:
#include<unistd.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
pid_t pid;
int count=0;
pid=fork();
count++;
printf("count=%d\n",count);
if (pid<0)
printf("error in fork");
else if(pid==0)
printf("the chile process ID is %d\n",getpid());
else
printf("the parent proicess ID is %d\n ",getpid());
return 0;
}
4.2 创建进程;#include<unistd.h>
pid_t fork(void) 调用一次,返回值为两个,返回为o,表示进入父进程,返回为新进程的ID号(非负),表示进入子进程,返回为负数时表示出现错误
pid_t vfork(void) 与fork(void)的区别:
fork()表示子父进程进程执行顺序不确定,子进程拷贝父进程,父子进程各自独自运行,当子进程结束时,只保留了进程号标志
vfork()表示子进程先运行,然后父进程在运行,共享同一段。
fork().代码实例:
#include<unistd.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
pid_t pid;
int count=0;
pid=fork();
count++;
printf("count=%d\n",count);
if (pid<0)
printf("error in fork");
else if(pid==0)
{printf("the chile process ID is %d\n",getpid());
printf("pid is %d\n",pid);
}
else
{
printf("the parent proicess ID is %d,%d\n ",getpid());
printf("pid is %d\n",pid);
}
return 0;
}
vfork()示例代码:
#include<unistd.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
pid_t pid;
int count=0;
pid=vfork();
count++;
printf("count=%d\n",count);
/*
if (pid<0)
printf("error in fork");
else if(pid==0)
printf("the chile process ID is %d\n",getpid());
else
printf("the parent proicess ID is %d\n ",getpid());
*/
return 0;
}
4.3 exec函数组(6个)
示例代码:
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
int main(int argc, char *argv[], char *envp[])
{
printf("\n### ARGC ###\n%d\n", argc);
printf("\n### ARGV ###\n");
while(*argv)
printf("%s\n", *(argv++));
printf("\n### ENVP ###\n");
while(*envp)
printf("%s\n", *(envp++));
return 0;
}
/**execl*/
#include<unistd.h>
#include<sys/types.h>
int main(void)
{
execl("/bin/ls","ls","-al","/etc/passwd",(char *)0);
}
/*exclp*/
#include<unistd.h>
#include<sys/types.h>
int main(void)
{
execlp("ls","ls","-al","/etc/passwd",(char *)0);
}
/*execv*/
#include<unistd.h>
#include<sys/types.h>
int main(void)
{
char * argv[]={"ls","-al","/etc/passwd",0};
execv("/bin/ls",argv);
return 0;
}
/*system*/
#include<unistd.h>
#include<sys/types.h>
int main(void)
{
system("ls -al /etc/passwd");
return 0;
}
/*wait*/
#include<unistd.h>
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
int main(int argc,char *argv[])
{
pid_t pc,pr;
pc=fork();
if (pc==0)
{
printf("the chile process ID is %d\n",getpid());
}
else if(pc>0)
{
pr=wait(NULL);
printf("the catch proicess ID is %d\n ",getpid());
}
exit(0);
}