• 编写多进程编程


    实验内容:有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
    ");
            exit(1);
        }
        else 
            if (child1 == 0) /*在子进程1中调用execlp()函数*/
           {
               printf("In child1: execute 'ls -l'
    ");
               if (execlp("ls", "ls", "-l", NULL) < 0)
               {
                   printf("Child1 execlp error
    ");
               }
           }
          else /*在父进程中再创建进程2,然后等待两个子进程的退出*/
          {
              child2 = fork();
              if (child2 == -1) /*子进程2的出错处理*/
              {
                  printf("Child2 fork error
    ");
                  exit(1);
              }
              else if(child2 == 0) /*在子进程2中使其暂停5s*/
              {
                  printf("In child2: sleep for 5 seconds and then exit
    ");
                sleep(5);
                exit(0);
            }
    
            printf("In father process:
    ");
            child = waitpid(child1, NULL, 0); /* 阻塞式等待 */
              if (child == child1)
              {
                  printf("Get child1 exit code
    ");
              }
              else
              {
                  printf("Error occured!
    ");
              }
              
              do
              {
                  child = waitpid(child2, NULL, WNOHANG);/* 非阻塞式等待 */
                  if (child == 0)
                  {
                      printf("The child2 process has not exited!
    ");
                      sleep(1);
                  }
              } while (child == 0);
              
              if (child == child2)
            {
                printf("Get child2 exit code
    ");
            }
            else
            {
                printf("Error occured!
    ");
            }
        }
        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
    ");
            exit(1);
        }
        else if (child1 == 0) /*在子进程1中调用execlp()函数*/
        {
                 printf("In child1: execute 'ls -l'
    ");
            if (execlp("ls", "ls", "-l", NULL) < 0)
            {
                printf("Child1 execlp error
    ");
            }
          }
          
          if (child2 == -1) /*子进程2的出错处理*/
          {
              printf("Child2 fork error
    ");
              exit(1);
          }
          else if( child2 == 0 ) /*在子进程2中使其暂停5s*/
          {
              printf("In child2: sleep for 5 seconds and then exit
    ");
              sleep(5);
              exit(0);
          }
          else /*在父进程中等待两个子进程的退出*/
          {
              printf("In father process:
    ");
              child = waitpid(child1, NULL, 0); /* 阻塞式等待 */
              if (child == child1)
              {
                  printf("Get child1 exit code
    ");
              }
              else
              {
                  printf("Error occured!
    ");
              }
              
              do
              {
                  child = waitpid(child2, NULL, WNOHANG);/* 非阻塞式等待 */
                  if (child == 0)
                  {
                      printf("The child2 process has not exited!
    ");
                      sleep(1);
                  }
              } while (child == 0);
              
              if (child == child2)
            {
                printf("Get child2 exit code
    ");
            }
            else
            {
                printf("Error occured!
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    Notepad++ 6.2.3 发布,开源文本编辑器
    Scrum项目如何获得管理层的支持和合作
    Concurrency Kit 0.2.13 发布,并发工具包
    Orubase:为Windows Phone、Android和iOS平台开发混合本地手机应用程序
    CyaSSL 2.4.6 发布,SSL 加密库
    谷歌移动应用强调设计元素:向极简风格转型
    Bitcoin 0.7.2 发布, 匿名数字货币
    Netty 3.5.11 发布
    LDAP Account Manager 4.0 发布
    Apache Commons Math 3.1 发布
  • 原文地址:https://www.cnblogs.com/yihujiu/p/5615198.html
Copyright © 2020-2023  润新知