四、多进程编程类
进程:进程是一个具有一定独立功能的程序的一次运行活动。
进程特点:动态性、并发性、独立性、异步性
进程状态:
进程ID:进程ID(PID):标识进程的唯一数字。父进程的ID(PPID)。启动进程的用户ID(UID)。
进程互斥:进程互斥是指当有若干进程都要使用某一资源时,但该资源在同一时刻最多允许一个进程使用,这时其他进程必须
等待,直到占用该资源者释放了该资源为止。
临界资源:操作系统中将同一时刻只允许一个进程访问的资源称为临界资源。
临界区:进程中访问临界资源的那段程序代码称为临界区。为实现对临界资源的互斥访问,应保证诸进程互斥地进入各自的临界区。
进程同步:一组进程按一定的顺序执行的过程称为进程间的同步.具有同步关系的这组进程称为合作进程,最为有名的是生产者和消费者进程。
进程调度:按一定算法,从一组待运行的进程中选出一个来占有CPU运行。
调度算法:先来先服务、短进程优先调度、高优先级优先调度、时间片轮转法。
按调度时机,调度可分为:抢占式调度、非抢占式调度
死锁:多个进程因竞争资源而形成一种僵局,导致这些进程都无法继续往前执行。
getpid: pid_t getpid(void);
作用:获得进程ID
头文件:sys/types.h unistd.h
返回值:进程ID
-
#include <sys/types.h>
-
#include <unistd.h>
-
-
void main()
-
{
-
pid_t pid;
-
-
pid = getpid();
-
-
printf("this process pid is %d\n",pid);
-
while(1);
-
}
4.1.创建进程: pid_t fork(void);
创建子进程
所属头文件: unistd.h
返回值: 成功:父进程中返回子进程PID,子进程中返回0 失败:-1
参数说明: 无
创建独立的栈
-
#include <unistd.h>
-
-
void main()
-
{
-
pid_t pid;
-
-
pid = fork();
-
if(pid > 0)
-
{
-
/*父进程*/
-
printf("this is father process.\n");
-
exit(0);
-
}
-
else if(pid == 0)
-
{
-
/*子进程*/
-
printf("this is child process.\n");
-
exit(0);
-
}
-
}
4.2.创建进程: pid_t vfork(void);
创建一个子进程,并阻塞父进程
所属头文件: sys/types.h unistd.h
返回值: 成功:父进程中返回子进程PID,子进程中返回0 失败:-1
参数说明: 无参数
vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。子进程使用父进程的栈。父进程可以使用return 0或exit(0)。而子进程必须使用exit(0).
-
#include <unistd.h>
-
#include <sys/types.h>
-
-
void main()
-
{
-
pid_t pid;
-
int count = 0;
-
-
pid = vfork();
-
-
count++;
-
printf("count = %d\n",count);
-
exit(0);
-
}
-
#include <sys/types.h>
-
#include <unistd.h>
-
-
void main()
-
{
-
pid_t pid;
-
-
pid = vfork();
-
if(pid > 0)
-
{
-
printf("this is father process.\n");
-
exit(0);
-
//return 0;
-
}
-
if(pid == 0)
-
{
-
printf("this is child process.\n");
-
exit(0);
-
//return 0;
-
}
-
}
4.3.进程等待: Pid_t wait(int *status);
函数功能: 挂起调用它的函数,直到其子进程结束
所属头文件: sys/types.h sys/wait.h
返回值: 成功:返回终止的那个子进程的ID 失败:-1
参数说明: status:记录子进程的退出状态.
-
#include <sys/types.h>
-
#include <sys/wait.h>
-
-
void main()
-
{
-
pid_t pid;
-
int status;
-
-
pid = fork();
-
if(pid > 0)
-
{
-
pid = wait(&status);
-
printf("chid pid is %d,status is %d\n",pid,status);
-
printf("this is father process.\n");
-
exit(0);
-
}
-
else if(pid == 0)
-
{
-
printf("this is child process.\n");
-
exit(0);
-
}
-
}
4.4.执行程序: int execl(const char*pathname,const char*arg,...);
运行可执行文件
所属头文件:
返回值: 成功:不返回 失败: 才返回
参数说明: pathname:要运行的可执行文件的路径
arg:可执行文件运行需要的参数
fork闯进一个新进程,exec替换原有代码,产生新进程。
-
#include <unistd.h>
-
#include <sys/types.h>
-
#include <sys/wait.h>
-
-
void main()
-
{
-
pid_t pid;
-
-
pid = vfork();
-
if(pid == 0)
-
{
-
/*NULL表示参数结束*/
-
execl("/bin/ls","ls","/home",NULL);
-
printf("this is child process.\n");
-
exit(0);
-
}
-
else if(pid > 0)
-
{
-
wait(NULL);
-
printf("this is father process.\n");
-
exit(0);
-
}
-
}
阅读(844) | 评论(0) | 转发(0) |