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; 成功, 不返回
- 前四个取路径名为参数。execlp()和execvp()取文件描述符为参数, 但是如果filename包含 “/”就取路径名, 否则按照PATH环境变量搜寻可执行文件(一般是shell文件)。
- execl(), execle(), execlp()函数最后参数以 “NULL”结尾。
/*************************************************************************
> File Name: environ_打印环境表参数.cpp
> Author: Function_Dou
> Mail:
> Created Time: 2018年02月01日 星期四 21时58分25秒
************************************************************************/
#include <stdio.h>
#include "apue.h"
int main(int argc, char *argv[])
{
int i;
char **ptr;
extern char **environ;
for(i = 0; i < argc; i++)
printf("argv[%d] : %s\n", i, environ[i]);
// 输出所有的环境变量
for(ptr = environ; *ptr != 0; ptr++)
printf("%s\n", *ptr);
exit(0);
}
解释器
解释器就是#! 后面可执行的程序。
对于解释器,exec族函数是这样做的(以execl为例),如果path是指向了一个脚本,脚本的第一行以#!开头,则:以#!后面的字符串为命令,后面加上execl参数列表中指定的参数列表,这样形成了新的程序执行。
如何理解解释器呢, 我看了些资料按照自己的思路整理了下。
先创建了一个cpp文件
/*************************************************************************
> File Name: jieshiqi.cpp
> Author: Function_Dou
> Mail:
> Created Time: 2018年02月01日 星期四 22时18分59秒
************************************************************************/
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
for(i = 0; i < argc; i++)
printf("argv[%d] : %s\n", i, argv[i]);
return 0;
}
又写了一个脚本
#!/home/RPZ/Code/Cc++/Process/a.out Function
# 这是我jieshiqi.cpp生成的a.out的位置
当然权限要设置够