spawn 系列函数 创建并运行子进程

本文介绍了spawn系列函数,包括L、V、P、E四个版本,用于在DOS环境中创建和运行子进程。详细解释了mode参数、path查找规则以及参数传递方式。示例代码展示了如何使用spawnlp函数等待子进程完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 */

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值