一进程控制原理
1
进程是一个具有一定独立功能的程序的一次运行活动。
进程是运行着的程序。
2
特点
动态性,并发性,独立性,异步性
3
状态
就绪态,执行态,阻塞态
4
进程ID-PID
父进程ID-PPID
启动进程的用户-UID
5
进程互斥
当硬件或软件资源不允许多个进程共同使用时就会产生互斥
6
临界资源
临界区:
7
进程同步:一组并发进程按《固定的顺序》执行的过程称为进程间的同步。
8
进程调度:从一组进程中选一个来占有CPU
调度方式:抢占式和非抢占式
9
调度算法:
先来先服务;短进程优先调度;高优先级优先调度;时间片轮转法
时间片轮转法:每个进程在时间片,进行轮转执行。
10
死锁:多个进程因竞争资源而形成的僵局。
实例:getpid.c、fork1.c、
fork_count
#include<unistd.h>
#include<stdio.h>
int main(void)
{
pid_t pid;
int count =0;
pid=fork();
count++;
printf("count=%d\n",count);
return 0;
}
上面,fork()后面的会被执行两次,父进程和子进程各执行一次,但彼此数据独立,so两次count值相等。
结果是count=1
count=1
vfork创建的父进程与子进程共用数据段
fork创建的父进程与子进程独立,不共用数据段
#include<unistd.h>
#include<stdio.h>
int main(void)
{
pid_t pid;
int count =0;
pid=vfork();
count++;
printf("count=%d\n",count);
return 0;
}
count=1
count=2
问题:我的count=1
count=13623285而且还循环不停显示
二进程控制程序设计1
获取ID
2
父进程:说到父进程,要提到子进程,当进程创建进程时,创建的进程为子进程,原来的进程为父进程。
pid_t getpid(void)
pid_t getppid(void)
3
进程传进
#include<unistd.h>
pid_t fork(void)
功能:创建子进程
代码段是共享的,子进程会将其拷贝过来,故:下面的程序,父进程执行一次,子进程也执行一独立
4
父进程和子进程的数据完全彼此。
5
vfork:子进程和父进程共享数据段
fork:父、子进程的执行次序不确定。
vfork:子进程先运行,父进程后运行
6
exec函数族
exec用《被执行的程序》替换《调用它的程序》。
fork创建新进程,产生一个新的PID
exec启动一个新程序,替换原有进程,因此进程PID不会改变
7
execl//包含路径
execlp//不包含路径
execv(const char*path,char*const argv[])//含路径,argv[]:被执行程序所需的命令行参数数组
实例
#include<unistd.h>
main()
{
execl("/bin/ls","ls","-al","/etc/passwd",(char*)0);
}
#include<unistd.h>
main()
{
char*argv[]={"ls","-al","/etc/passwd",(char*)0};
execv(“/bin/ls",argv);
}
#include<stdlib.h>
void main()
{
system("ls -al /etc/passwd");
}
8
system.c///system调用exec产生子进程
9
pid_t wait(int *status)//等带其某个子进程退出。
实例
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
void mian()
{
pid_t pc,pr;
pc fork();
if(pc==0)
{
printf("This is chile process with pid of %d\n",getpid());
sleep(10);//睡眠10秒
}
else if(pid>0)//如果是父进程
{
pr=wait(NULL);
printf(“I catched a chile process with pid of %d\n”,pr);
}
exit(0);
}