zoukankan      html  css  js  c++  java
  • linux 编辑、编译链接、执行C语言并发程序

    父进程创建一个子进程,并等待子进程结束;子进程调用execve启动

    使用shell的ps命令,查看系统当前的进程信息

    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    main()
    {
      pid_t pid;
      char* str;
      char* path="/bin/ps";
      char* argv[5]={"ps","-a","-x",NULL};
      if ((pid=fork())<0)    //创建子进程
         { 
           printf("创建子进程错误
    ");
           exit(0);
         }
    else if(pid==0)
      {      //以下为子进程代码:
             printf("由子进程运行ps命令,以查看系统当前进程信息。
    ");
             if (execve(path,argv,0)<0)     //子进程执行ps命令文件
                {
                   printf("子进程执行错误
    ");
                   exit(0);
                }
              printf("子进程成功执行
    ");
              exit(0);  //子进程结束
      }
       // pid>0时继续父进程执行(pid为子进程号):
       wait();   //父进程等待子进程结束
       printf("父进程退出!
    ");
       exit(0);  //父进程结束
    }

    函数说明:

    1. pid_t fork(void) :创建子进程。如创建成功,在父进程返回子进程代码,在子进程则返回0。fork()创建的子进程与父进程运行于不同的地址空间,即父子各有独立空间,但子进程会复制父进程的资源(如同一份代码,打开文件等等)。父子进程之间的通信只能通过共享内存、消息、管道等方式进行。
    2. pid_t wait():暂停当前进程的执行,直到有信号来或者子进程结束。

    3.  void exit(int status):正常结束当前进程,并把参数status返回给父进程

    4.  int execve(const char* filename,char* const argv[],char* const envp[])

      执行参数filename字符串所代表的文件路径,argv传递给执行文件,envp为执行文件需要的新环境变量。如执行文件能成功执行则函数不会返回,执行失败返回-1。
    5. pid_t vfork(void):创建子进程。vfork()不同fork()。vfor()创建的子进程与父进程共享同一地址空间,即子进程完全运行在父进程的地址空间上,子进程对虚拟地址空间任何数据的修改,父进程可见。但父进程创建子进程之后,父进程会被阻塞,直到子进程执行exec()或exit()。

  • 相关阅读:
    linux网络配置
    第二章 以太网和数据封装
    linux用户权限
    第一章 网络互联
    linux学习之文件系统
    史上最全Java学习视频下载地址分享
    JAVA高级特性之集合
    Map集合不继承Collection接口,(HashMap类和TreeMap类)---输出结果,如果将Key值修改为首位不为0,HashMap输出就是随机顺序的,求指导,为什么为会这样???
    java中this关键字
    Java long数据类型---网上学习到的资料
  • 原文地址:https://www.cnblogs.com/Meng2113/p/12458657.html
Copyright © 2011-2022 走看看