编写多进程编程

实验内容:有3个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行"ls -l"指令,另一个子进程暂停5s之后异常退出,父进程先用阻塞方式等待第一子进程的结束,然后用非阻塞方式等待另一个子进程退出,等待收集到第二个子进程结束的信息,父进程就返回。

/* multi_proc.c */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void)
{
    pid_t child1, child2, child;

    /*创建两个子进程*/
    child1 = fork();
    /*子进程1的出错处理*/
    if (child1 == -1)
    {
        printf("Child1 fork error\n");
        exit(1);
    }
    else
        if (child1 == 0) /*在子进程1中调用execlp()函数*/
       {
           printf("In child1: execute ‘ls -l‘\n");
           if (execlp("ls", "ls", "-l", NULL) < 0)
           {
               printf("Child1 execlp error\n");
           }
       }
      else /*在父进程中再创建进程2,然后等待两个子进程的退出*/
      {
          child2 = fork();
          if (child2 == -1) /*子进程2的出错处理*/
          {
              printf("Child2 fork error\n");
              exit(1);
          }
          else if(child2 == 0) /*在子进程2中使其暂停5s*/
          {
              printf("In child2: sleep for 5 seconds and then exit\n");
            sleep(5);
            exit(0);
        }

        printf("In father process:\n");
        child = waitpid(child1, NULL, 0); /* 阻塞式等待 */
          if (child == child1)
          {
              printf("Get child1 exit code\n");
          }
          else
          {
              printf("Error occured!\n");
          }

          do
          {
              child = waitpid(child2, NULL, WNOHANG);/* 非阻塞式等待 */
              if (child == 0)
              {
                  printf("The child2 process has not exited!\n");
                  sleep(1);
              }
          } while (child == 0);

          if (child == child2)
        {
            printf("Get child2 exit code\n");
        }
        else
        {
            printf("Error occured!\n");
        }
    }
    return 0;
}

第二种代码写法:

/* multi_proc_wrong.c */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void)
{
    pid_t child1, child2, child;
    /*创建两个子进程*/
    child1 = fork();
    child2 = fork();
    /*子进程1的出错处理*/
    if (child1 == -1)
    {
        printf("Child1 fork error\n");
        exit(1);
    }
    else if (child1 == 0) /*在子进程1中调用execlp()函数*/
    {
             printf("In child1: execute ‘ls -l‘\n");
        if (execlp("ls", "ls", "-l", NULL) < 0)
        {
            printf("Child1 execlp error\n");
        }
      }

      if (child2 == -1) /*子进程2的出错处理*/
      {
          printf("Child2 fork error\n");
          exit(1);
      }
      else if( child2 == 0 ) /*在子进程2中使其暂停5s*/
      {
          printf("In child2: sleep for 5 seconds and then exit\n");
          sleep(5);
          exit(0);
      }
      else /*在父进程中等待两个子进程的退出*/
      {
          printf("In father process:\n");
          child = waitpid(child1, NULL, 0); /* 阻塞式等待 */
          if (child == child1)
          {
              printf("Get child1 exit code\n");
          }
          else
          {
              printf("Error occured!\n");
          }

          do
          {
              child = waitpid(child2, NULL, WNOHANG);/* 非阻塞式等待 */
              if (child == 0)
              {
                  printf("The child2 process has not exited!\n");
                  sleep(1);
              }
          } while (child == 0);

          if (child == child2)
        {
            printf("Get child2 exit code\n");
        }
        else
        {
            printf("Error occured!\n");
        }
    }
    return 0;
}
时间: 2024-11-06 14:41:52

编写多进程编程的相关文章

PHP多进程编程(一)

虽然PHP 中,多进程用的比较的少.但是毕竟可能是会用到了.我最近就遇到这样一个问题,用户提交几百个url以后,要读出这个url 中的标题. 当然,你不希望用户等待的太久,10s 钟应该给出个答案.但是,本身,你要获取一个url 的标题,少的要 0.1s ,多的要好几秒. 显然,采用单个线程的方式是不行的. 我的第一个设计方案是这样的: 1. 用我前面提供的代码提供一个简单的服务器:  http://www.cnblogs.com/niniwzw/archive/2009/09/27/15750

Linux下的多进程编程

1.进程 1.1进程的定义 <计算机操作系统>这门课对进程有这样的描述:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. 1.2进程的概念 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text

Python的多进程编程

考虑到多线程,都在一个主进程中共享栈变量,在操作同一个局部变量时可能出现絮乱的现象,即使加锁也容易出现死锁的现象,小编在这里再次记录下多进程编程,废话不多说,直接上代码: #!/usr/bin/env python #encoding: utf-8 import multiprocessing import time def process_one(interval): n =5 while n >0: print ("the time is {0}".format(time.c

多进程编程总述

1.进程创建:fork函数族 fork()和vfork()函数的区别: (1) fork ( ):子进程拷贝父进程的数据段,代码段 vfork( ):子进程与父进程共享数据段 (2) fork( )父子进程的执行次序不确定 vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec或exit 之后父进程才可能被调度运行.也就是说父进程在子进程调用exec或exit函数族之前一直保持阻塞. (3) vfork( )保证子进程先运行,在它调用exec 或ex

多进程编程的优缺点

转自原文 多进程编程的优缺点 多进程优点: 每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系: 通过增加CPU,就可以容易扩充性能: 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系: 每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大 多线程缺点: 逻辑控制复杂,需要和主程序交互: 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送.密集运算 多进程调度开销比较大: 最好是多进程和多线程结合,即根据实际的需要,每个CP

Linux高性能服务器编程——多进程编程

多进程编程 多进程编程包括如下内容: 复制进程影映像的fork系统调用和替换进程映像的exec系列系统调用. 僵尸进程以及如何避免僵尸进程 进程间通信(Inter-Process Communication,IPC)最简单的方式:管道 3种进程间通信方式:信号量,消息队列和共享内存 fork系统调用 #include<unistd.h> pid_tfork(void); 该函数的每次都用都返回两次,在父进程中返回的是子进程的PID,在子进程中返回的是0.该返回值是后续代码判断当前进程是父进程还

Linux多进程编程实例

前言:编写多进程程序时,我们应该了解一下,创建一个子进程时,操作系统内核是怎样做的.当通过fork函数创建新的子进程时,内核将父进程的用户地址空间的内容复制给子进程,这样父子进程拥有各自独立的用户空间,当父进程修该变量的值时不会影响子进程中的相应变量.但为了提高效率,Linux采用了COW(copy on write)算法,子进程创建时,父子进程享有相同的地址空间,只是在页表中设置cow标识,只有在父进程或子进程执行写数据操作时,才为子进程申请一个物理页,将父进程空间中相应数据所在页的内容复制到

PHP多进程编程(2):管道通信

一个进程如果是个人英雄主义,那么多进程就是集体主义.(不严格区分多进程 和 多线程的差别) 你不再是一个独行侠,而是一个指挥家. 独来独往,非常自由自在,但是,很多时候,不如众人拾柴火焰高. 这就是我对多进程的理解.多线程编程的主要问题是:通信 和 同步问题. 更多PHP 多线程编程的背景知识见: PHP多进程编程(一) 在PHP 中,如果光用pcntl ,实现比较简单的通信问题都是很困难的. 下面介绍管道通信: 1. 管道可以认为是一个队列,不同的线程都可以往里面写东西,也都可以从里面读东西.

Android 多进程编程 15问15答!

ps:阅读本文 需要对android 多进程编程有一定了解. 1.Android中总共有几种方式进行IPC? 答:一共有两种,一种是binder 还有一种是socket.Binder 大家用的比较多.Socket很少有人用,这里给出一个利用Socket进行ipc通信的例子. 服务端代码: 1 package com.example.administrator.socketipcdemo; 2 3 import android.app.Service; 4 import android.conte