A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

父进程创建一个子进程,并等待子进程结束;子进程调用execve启动
使用shell的ps命令,查看系统当前的进程信息
[url=][/url]
#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("创建子进程错误\n");       exit(0);     }else if(pid==0)  {      //以下为子进程代码:         printf("由子进程运行ps命令,以查看系统当前进程信息。\n");         if (execve(path,argv,0)<0)     //子进程执行ps命令文件            {               printf("子进程执行错误\n");               exit(0);            }          printf("子进程成功执行\n");          exit(0);  //子进程结束  }   // pid>0时继续父进程执行(pid为子进程号):   wait();   //父进程等待子进程结束   printf("父进程退出!\n");   exit(0);  //父进程结束}[url=][/url]

函数说明:
  • pid_t fork(void) :创建子进程。如创建成功,在父进程返回子进程代码,在子进程则返回0。fork()创建的子进程与父进程运行于不同的地址空间,即父子各有独立空间,但子进程会复制父进程的资源(如同一份代码,打开文件等等)。父子进程之间的通信只能通过共享内存、消息、管道等方式进行。
  • pid_t wait():暂停当前进程的执行,直到有信号来或者子进程结束。
  • void exit(int status):正常结束当前进程,并把参数status返回给父进程
  • int execve(const char* filename,char* const argv[],char* const envp[])
    执行参数filename字符串所代表的文件路径,argv传递给执行文件,envp为执行文件需要的新环境变量。如执行文件能成功执行则函数不会返回,执行失败返回-1。
  • pid_t vfork(void):创建子进程。vfork()不同fork()。vfor()创建的子进程与父进程共享同一地址空间,即子进程完全运行在父进程的地址空间上,子进程对虚拟地址空间任何数据的修改,父进程可见。但父进程创建子进程之后,父进程会被阻塞,直到子进程执行exec()或exit()。



以上文章转载自网络


1 个回复

倒序浏览
有问题联系小优:DKA-2018
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马