spawn 系列函数
L 系列:
int spawnl (int mode, char *path, char *arg0, char *arg1, ... , NULL);
int spawnlp (int mode, char *path, char *arg0, char *arg1, ..., NULL);
int spawnle (int mode, char *path, char *arg0, char *arg1, ..., NULL, char *envp[]);
int spawnlpe (int mode, char *path, char *arg0, char *arg1, ..., NULL, char *envp[]);
V 系列:
int spawnv (int mode, char *path, char *arg[], NULL);
int spawnvp (int mode, char *path, char *arg[] , NULL);
int spawnve (int mode, char *path, char *arg[] , NULL, char *envp[]);
int spawnvpe (int mode, char *path, char *arg[] , NULL, char *envp[]);
说明: 原型在 process.h
spawn...系列函数可以加载并运行称为子进程的其它文件。必须有足够的内存。mode 值用心确定调用函数(父进程)在调用 spawn... 之后 所采取的动作:
P_WAIT 父进程挂起直到子进程执行完毕
P_NOWAIT 父进程和子进程同时运行(目前 TC2 不支持)
P_OVERLAY 子进程将覆盖父进程原有的存储区位置, 这与 exec... 调用相同
* path 是被调用子进程文件名。spawn...函数通过标准的 DOS 搜索算法来查找
path:
1. 如果木有扩展名或者句点:先查找该名;如果没有找到,就加上.com,.exe扩展名再找
2. 如果给定扩展名, 直接查找给定 的文件
3. 如果给出句点, 则查找没有扩展名的文件
4. 如果path没有包含确定的目录, 含有 p 后缀的 spawn...函数 首先在当前目录下查找,
如果找不到,就 再查找DOS环境变量PATH所指定的目录
#include<stdio.h>
#include<process.h>
void main()
{
int result;
result = spawnlp (P_WAIT, "h://o utput// ten2bin.exe", NULL);
if (result == -1)
{
perror("Error from spawnl");
exit(1);
}
}
加在 spawn...系列函数后的后缀 L, V, P, E 表示命名函数的某种操作能力;
L:
表明指针参数 arg0, arg1, ... 作为独立参数进行传递。通常, L 后缀用于事先知道待传递参数个数的情况
V:
表明扎针参数 arg0], arg[1], ..., arg[n] 作为指针数组进行传递。通常, V 后缀用于待传递参数个数可变的情况
P:
表明如果没有指定目录,则首先在当前目录下查找文件,没有找到时再到环境变量PATH 指定的路径查找
E:
表明参数envp可以传到子进程,用以改变子进程的环境。在没有e后缀的情况下,子进程将继承父进程的环境
spawn... 系列函数必须至少传递一个 参数(arg0 或 arg[0])给子进程,该参数约定为 path 的一个拷贝。类似于 main(int argc, char * argv[])中的 argv[0], argn / arg[n] 后的 NULL 表示参数表结束。
执行成功时,返回值为子进程的退出状态(0为正常终结)。如果子进程 调用 了非0参数的exit函数,退出状态则为非0值。
出现错误时,spawn...函数返回值 -1, 并将全局变量errno设置为下列之一。
E2BIG 参数表太长
EINVAL 无效参数
ENOENT 路径或者文件名没有找到
ENOEXEC 运行格式错
ENOMEM 无足够内存
可移植性: 适用于DOS
process.h中的一些定义:
/* Modes available as first argument to the spawnxx functions. */
#define P_WAIT 0 /* child runs separately, parent waits until exit */
#define P_NOWAIT 1 /* both concurrent -- not implemented */
#define P_OVERLAY 2 /* child replaces parent, parent no longer exists */