linux应用编程学习(4)多进程编程

四、多进程编程类

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

进程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. }


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(301) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

习惯就好zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值