exec函数和system()函数

博客主要介绍了C++在Linux/Unix环境下exec函数和system()函数的使用。exec函数用于替换进程的程序,不创建新进程;system()函数在实现中涉及fork(), waitpid(), exec()。文章提到了exec函数族的不同变体,如execlp()和execvp(),并讲解了如何处理脚本中的解释器。同时,还讨论了system()函数的返回值情况以及nice()值对进程优先级的影响。" 79804976,7506070,Visual Studio预编译头文件详解,"['C++', '开发工具', 'Visual Studio']
摘要由CSDN通过智能技术生成





exec函数和system()函数

exec函数和system()函数

进程控制


关于这一章基本是按照书上的知识写的, 虽然不明白查了一些资料, 但是后面明白了觉得还是书上写的好, 也就没有自己太多的想法,只是整理加深印象而已, 如果只是寻找理解的朋友, 这就不是很有用了。

进程掉用exec时, 该进程执行的程序会完全替换成新的程序, 也就是直接从main函数开始重新执行。
exec调用不会创建新的进程, 所以也就不会有新的ID产生。
exec只是用磁盘上新程序替换了现在进程的堆栈, 数据段, 正文段.

fork()创造新的进程, exec创造新的程序, exit和wait返回进程终止和等待终止.
进程中每个打开文件描述符都应该在exec执行前进行关闭, 否则执行exec后这些文件描述符将继续打开而不会关闭

我觉得着这函数还是后面要用, 自己也想加深一下理解, 所以写了出来, 不想看闲麻烦的也可以跳过

#include < unistd.h>
int execl(const char *pathname, const char arg0, … /* (char) 0 */)
int execv(const char *pathname, char *const argv[]);
int execle(const char *pathname, const char *arg0, … /* (char *) 0, char *const envp[] */
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *arg0, … /* (char *)0 */);
int execvp(const char *filename, char *const argv[]);
int fexecve(int fd, char *const argv[], char *const envp[]);
  1. 错误, 返回 -1; 成功, 不返回
  2. 前四个取路径名为参数。execlp()和execvp()取文件描述符为参数, 但是如果filename包含 “/”就取路径名, 否则按照PATH环境变量搜寻可执行文件(一般是shell文件)。
  3. execl(), execle(), execlp()函数最后参数以 “NULL”结尾。
  
  
  
  1. /*************************************************************************
  2. > File Name: environ_打印环境表参数.cpp
  3. > Author: Function_Dou
  4. > Mail:
  5. > Created Time: 2018年02月01日 星期四 21时58分25秒
  6. ************************************************************************/
  7. #include <stdio.h>
  8. #include "apue.h"
  9. int main(int argc, char *argv[])
  10. {
  11. int i;
  12. char **ptr;
  13. extern char **environ;
  14. for(i = 0; i < argc; i++)
  15. printf("argv[%d] : %s\n", i, environ[i]);
  16. // 输出所有的环境变量
  17. for(ptr = environ; *ptr != 0; ptr++)
  18. printf("%s\n", *ptr);
  19. exit(0);
  20. }

解释器

解释器就是#! 后面可执行的程序。
对于解释器,exec族函数是这样做的(以execl为例),如果path是指向了一个脚本,脚本的第一行以#!开头,则:以#!后面的字符串为命令,后面加上execl参数列表中指定的参数列表,这样形成了新的程序执行。

如何理解解释器呢, 我看了些资料按照自己的思路整理了下。
先创建了一个cpp文件

  
  
  
  1. /*************************************************************************
  2. > File Name: jieshiqi.cpp
  3. > Author: Function_Dou
  4. > Mail:
  5. > Created Time: 2018年02月01日 星期四 22时18分59秒
  6. ************************************************************************/
  7. #include <stdio.h>
  8. int main(int argc, char *argv[])
  9. {
  10. int i;
  11. for(i = 0; i < argc; i++)
  12. printf("argv[%d] : %s\n", i, argv[i]);
  13. return 0;
  14. }

又写了一个脚本

  
  
  
  1. #!/home/RPZ/Code/Cc++/Process/a.out Function
  2. # 这是我jieshiqi.cpp生成的a.out的位置

当然权限要设置够

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值