四、多进程编程类
进程特点:动态性、并发性、独立性、异步性
进程状态:
进程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);
- }
- }