linux|linux 编辑、编译链接、执行C语言并发程序
父进程创建一个子进程,并等待子进程结束;子进程调用execve启动
【linux|linux 编辑、编译链接、执行C语言并发程序】使用shell的ps命令,查看系统当前的进程信息
#include#include #include 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); //父进程结束 }
函数说明:
- 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()。
推荐阅读
- 《中华人民共和国环境保护税法》知识问答
- Docker安装RabbitMQ详细步骤
- 面试~jvm(JVM内存结构、类加载、双亲委派机制、对象分配,了解垃圾回收)
- SSM框架解析|【SSM框架】Mybatis详解10(源码自取)之入参、返回值map
- 链表|[java刷算法]牛客—剑指offer链表有环的入口、反转链表、合并排序链表
- Linux软件包常见的几种下载、安装方法
- Golang|Golang 动态脚本调研
- sklearn|数据挖掘的五大流程、sklearn中常用的模块介绍、数据预处理、特征选择(过滤法+Embedded嵌入法+Wrapper包装法)
- sklearn|【数据预处理】sklearn实现数据预处理(归一化、标准化)
- sklearn机器学习|学习笔记——sklearn数据预处理和特征工程(过滤法、嵌入法、包装法)