exec()&fork()配合使用运行不同的进程
2009-05-26 10:23
253 查看
sunbox$ cat exec1.c #include <unistd.h> #include <stdio.h> int main (void) { /* Define a null terminated array of the command to run followed by any parameters, in this case none */ char *arg[] = { "/bin/ls", 0 }; /* fork, and exec within child process */ if (fork() == 0) { printf("In child process:/n"); execv(arg[0], arg); printf("I will never be called/n"); } printf("Execution continues in parent process/n"); } sunbox$ gcc exec1.c -o exec1 sunbox$ ./exec1 In child process: fork1.c exec1 fork2 exec1.c fork1 fork2.c Execution continues in parent process
代码首先定义一个数组,其中第一个元素是要执行的二进制文件的路径,其余元素充当命令行参数。根据手册页的描述,该数组以 Null 结尾。在从
fork系统调用返回以后,将指示子进程执行 (
execv) 新的二进制文件。
execv调用首先取得一个指向要运行的二进制文件名称的指针,然后取得一个指向您前面声明的参数数组的指针。该数组的第一个元素实际上是二进制文件的名称,因此参数实际上是从第二个元素开始的。请注意,该子进程一直没有从
execv调用返回。这表明正在运行的进程已被新进程所替换。
还存在其他执行 (
exec) 某个进程的系统调用,它们的区别在于接受参数的方式和是否需要传递环境变量。
execv(2)是替换当前映像的较简单方法之一,因为它不需要关于环境的信息,并且它使用以 Null 结尾的数组。其他选项包括
execl(2)(它单独接受各个参数)或
execvp(2)(它也接受一个以 Null 结尾的环境变量数组)。使问题复杂化的是,并非所有操作系统都支持所有变体。关于使用哪一种变体的决定取决于平台、编码风格和是否需要定义任何环境变量。
相关文章推荐
- Linux下的多进程编程(转) - fork(),exec()等函数的使用[zz]
- QT单实例应用,使用QLocalSocket进行进程通信,不同运行权限下运行的同一个进程通讯失败,报错 “QLocalSocket::SocketAccessError”
- "同一 IIS 进程中不可能运行两个不同的 ASP.NET 版本"解决方案
- maven使用exec插件运行Java main方法,以下是3种不同的操作方式。
- 在同一 IIS 进程中不可能运行两个不同的 ASP.NET 版本。请使用 IIS 管理工...
- Head First C 第九章 进程与系统调用 用fork()+exec()运行子进程
- 关于fork&exec之进程的创建和可执行程序的加载过程
- Linux下的多进程编程——fork(),exec()等函数的使用
- 一台机子上运行使用不同Java版本的多个tomcat
- linux&nbsp;中查看某个单进程程序运行所…
- 在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)
- Linux运行与控制后台进程的方法:nohup, setsid, &, disown, screen
- 使用两个不同类型的数据进行加法计算时,使用异常处理语句捕获由于数据类型错误而出现的异常,发生生成错误。是否继续并运行上次的成功生成?
- IIS6同一 IIS 进程中不可能运行两个不同的 ASP.NET 版本
- 关于连续使用fork()到底产生多少个子进程问题的实践
- 创建进程 fork()函数的基本使用 父子进程之间的关系
- Linux下Fork与Exec使用
- 使用zookeeper解决程序在不同集群之间运行的高可用
- 使用ptrace向已运行进程中注入.so并执行相关函数
- 第七章 进程控制开发[fork() exec exit _exit wait waitpid 守护进程]