Chinaunix首页 | 论坛 | 博客
  • 博客访问: 493897
  • 博文数量: 223
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2145
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-01 10:23
个人简介

该坚持的时候坚持,该妥协的时候妥协,该放弃的时候放弃

文章分类

全部博文(223)

文章存档

2017年(56)

2016年(118)

2015年(3)

2014年(46)

我的朋友

分类: LINUX

2014-04-11 20:59:29

四、多进程编程类

进程:进程是一个具有一定独立功能的程序的一次运行活动
进程特点动态性、并发性、独立性、异步性
进程状态:

进程ID
进程ID(PID):标识进程的唯一数字。父进程的ID(PPID)。启动进程的用户ID(UID)。
进程互斥:进程互斥是指当有若干进程都要使用某一资源时,但该资源在同一时刻最多允许一个进程使,这时其他进程必须
等待,直到占用该资源者释放了该资源为止。
临界资源:操作系统中将同一时刻只允许一个进程访问的资源称为临界资源。
临界区:进程中访问临界资源的那段程序代码称为临界区。为实现对临界资源的互斥访问,应保证诸进程互斥地进入各自的临界区。
进程同步一组进程一定的顺序执行的过程称为进程间的同步.具有同步关系的这组进程称为合作进程,最为有名的是生产者和消费者进程。
进程调度:按一定算法,从一组待运行的进程中选出一个占有CPU运行。
调度算法:先来先服务、短进程优先调度、高优先级优先调度、时间片轮转法。
按调度时机,调度可分为:抢占式调度、非抢占式调度
死锁:多个进程因竞争资源而形成一种僵局,
导致这些进程都无法继续往前执行。

getpid: pid_t getpid(void);
作用:获得进程ID
头文件:sys/types.h   unistd.h
返回值:
进程ID
  1. #include <sys/types.h>
  2. #include <unistd.h>

  3. void main()
  4. {
  5.     pid_t pid;

  6.     pid = getpid();

  7.     printf("this process pid is %d\n",pid);
  8.     while(1);
  9. }

4.1.创建进程:                          pid_t fork(void);

                                            创建子进程

    所属头文件:                       unistd.h

    返回值:                       成功:父进程中返回子进程PID,子进程中返回0    失败:-1

    参数说明:                   无
创建独立的栈

  1. #include <unistd.h>

  2. void main()
  3. {
  4.     pid_t pid;

  5.     pid = fork();
  6.     if(pid > 0)
  7.     {
  8.         /*父进程*/
  9.         printf("this is father process.\n");
  10.         exit(0);
  11.     }
  12.     else if(pid == 0)
  13.     {
  14.         /*子进程*/
  15.         printf("this is child process.\n");
  16.         exit(0);
  17.     }
  18. }


 

4.2.创建进程:                         pid_t vfork(void);

                                            创建一个子进程,并阻塞父进程

    所属头文件:                        sys/types.h unistd.h

    返回值:                              成功:父进程中返回子进程PID,子进程中返回0     失败:-1

    参数说明:                          无参数
vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。子进程使用父进程的栈。父进程可以使用return 0或exit(0)。而子进程必须使用exit(0).

  1. #include <unistd.h>
  2. #include <sys/types.h>

  3. void main()
  4. {
  5.     pid_t pid;
  6.     int count = 0;

  7.     pid = vfork();

  8.     count++;
  9.     printf("count = %d\n",count);
  10.     exit(0);
  11. }


  1. #include <sys/types.h>
  2. #include <unistd.h>

  3. void main()
  4. {
  5.     pid_t pid;

  6.     pid = vfork();
  7.     if(pid > 0)
  8.     {
  9.         printf("this is father process.\n");
  10.         exit(0);
  11.         //return 0;
  12.     }
  13.     if(pid == 0)
  14.     {
  15.         printf("this is child process.\n");
  16.         exit(0);
  17.         //return 0;
  18.     }
  19. }

 

4.3.进程等待:                        Pid_t wait(int *status);

    函数功能:                         挂起调用它的函数,直到其子进程结束

    所属头文件:                     sys/types.h  sys/wait.h

    返回值:                            成功:返回终止的那个子进程的ID    失败:-1

    参数说明:                        status:记录子进程的退出状态.

  1. #include <sys/types.h>
  2. #include <sys/wait.h>

  3. void main()
  4. {
  5.     pid_t pid;
  6.     int status;

  7.     pid = fork();
  8.     if(pid > 0)
  9.     {
  10.         pid = wait(&status);
  11.         printf("chid pid is %d,status is %d\n",pid,status);
  12.         printf("this is father process.\n");
  13.         exit(0);
  14.     }
  15.     else if(pid == 0)
  16.     {
  17.         printf("this is child process.\n");
  18.         exit(0);
  19.     }
  20. }


4.4.执行程序:                        int execl(const char*pathname,const char*arg,...);

                                           运行可执行文件

    所属头文件:                      

    返回值:                           成功:不返回   失败才返回

    参数说明:                        pathname:要运行的可执行文件的路径

                                         arg:可执行文件运行需要的参数

 fork闯进一个新进程,exec替换原有代码,产生新进程。

  1. #include <unistd.h>
  2. #include <sys/types.h>
  3. #include <sys/wait.h>

  4. void main()
  5. {
  6.     pid_t pid;
  7.     
  8.     pid = vfork();
  9.     if(pid == 0)
  10.     {
  11.         /*NULL表示参数结束*/
  12.         execl("/bin/ls","ls","/home",NULL);
  13.         printf("this is child process.\n");
  14.         exit(0);
  15.     }
  16.     else if(pid > 0)
  17.     {
  18.         wait(NULL);
  19.         printf("this is father process.\n");
  20.         exit(0);
  21.     }
  22. }


阅读(844) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~