C语言函数大全 本篇介绍C语言函数大全-- _w 开头的函数 1. _wspawnl 1.1 函数说明 函数声明 函数功能 int _wspawnl(int mode, const wchar_t* cmdname, const wchar_t* arglist, ...); 启动一个新的进程并运行指定
C语言函数大全
本篇介绍C语言函数大全-- _w 开头的函数
1. _wspawnl
1.1 函数说明
int _wspawnl(int mode, const wchar_t* cmdname, const wchar_t* arglist, ...);
启动一个新的进程并运行指定的可执行文件
参数:
- mode : 启动命令的模式,可以是
_P_WAIT
或_P_NOWAIT
的任意一种:
_P_WAIT
:等待新进程结束之后才继续执行当前进程_P_NOWAIT
:不等待新进程结束,立即返回并继续执行当前进程- cmdname : 要执行的可执行文件的名称,可以包含完整路径或者只有文件名。如果只有文件名,则将从当前工作目录中查找可执行文件。如果当前工作目录中没有找到该文件,则将失败并返回错误代码。
- arglist : 可选,传递给子进程的命令行参数字符串。多个参数以空格分隔
- ... : 可选,用于传递命令行参数的可变参数列表,必须以一个
NULL
结尾
1.2 演示示例
1.2.1 SubTest.c
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("exec %s, Hello, %s", argv[0], argv[1]);
return 0;
}
1.2.2 Test.c
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <process.h>
int main()
{
const wchar_t* cmdname = L"SubTest.exe";
const wchar_t* arglist = L"SubTest.exe huazie";
// 同步启动新进程,等待子进程完成
int mode = _P_WAIT;
// 启动新进程
int result = _wspawnl(mode, cmdname, arglist, NULL);
// 打印子进程的退出代码
printf("\nChild process exited with code %d\n", result);
return 0;
}
注意: 上述示例是一个同步(阻塞)调用。如果你想启动一个异步进程(不等待它结束),则可以将
mode
参数设置为_P_NOWAIT
。在这种情况下,函数会立即返回,父进程不会等待新进程完成。
1.3 运行结果
2. _wspawnle
2.1 函数说明
int _wspawnle(int mode, const wchar_t* cmdname, const wchar_t* arglist, ... , const wchar_t* envptr[]);
启动一个新的进程并通过指定的环境变量传递参数,来运行指定的可执行文件
参数:
- mode : 启动命令的模式,可以是
_P_WAIT
或_P_NOWAIT
的任意一种:
_P_WAIT
:等待新进程结束之后才继续执行当前进程_P_NOWAIT
:不等待新进程结束,立即返回并继续执行当前进程- cmdname : 要执行的可执行文件的名称,可以包含完整路径或者只有文件名。如果只有文件名,则将从当前工作目录中查找可执行文件。如果当前工作目录中没有找到该文件,则将失败并返回错误代码。
- arglist : 可选,传递给子进程的命令行参数字符串。多个参数以空格分隔
- ... : 可选,用于传递命令行参数的可变参数列表,必须以一个
NULL
结尾- envptr: 可选,包含所有需要在子进程中使用的环境变量。如果为
NULL
,则子进程使用调用进程的当前环境
2.2 演示示例
2.2.1 SubEnvTest.c
#include <process.h>
#include <processenv.h>
#include <stdio.h>
int main(int argc, char *argv[], char **envp)
{
printf("SubEnvTest Command line arguments:\n");
for (int i=0; i<argc; i++)
printf("[%d] : %s\n", i, argv[i]);
printf("exec %s, Hello, %s\n", argv[0], argv[1]);
for (int i = 0; envp[i] != NULL; i++)
{
printf("%s\n", envp[i]);
}
// while(*envp != NULL)
// printf(" %s\n", *(envp++));
return 0;
}
2.2.2 Test.c
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <process.h>
int main()
{
const wchar_t* cmdname = L"SubEnvTest.exe";
const wchar_t* arglist[] = { L"SubEnvTest.exe", L"Huazie", NULL };
const wchar_t* envptr[] = { L"Hello=world", NULL };
// 同步启动新进程,等待子进程完成
int mode = _P_WAIT;
// 启动新进程
int result = _wspawnle(mode, cmdname, arglist[0], arglist[1], NULL, envptr);
// 打印子进程的退出代码
printf("\nChild process exited with code %d\n", result);
return 0;
}
2.3 运行结果
3. _wspawnlp
3.1 函数说明
int _wspawnl(int mode, const wchar_t* cmdname, const wchar_t* arg0, ...);
启动一个新的进程并运行指定的可执行文件。它与 _wspawnl
函数类似,但参数列表略有不同
参数:
- mode : 启动命令的模式,可以是
_P_WAIT
或_P_NOWAIT
的任意一种:
_P_WAIT
:等待新进程结束之后才继续执行当前进程_P_NOWAIT
:不等待新进程结束,立即返回并继续执行当前进程- cmdname : 要执行的可执行文件的名称,可以包含完整路径或者只有文件名。如果只有文件名,则会在环境变量
PATH
指定的目录中查找可执行文件- arg0 : 可选,第一个命令行参数字符串
- ... : 可选,用于传递命令行参数的可变参数列表,必须以一个
NULL
结尾
3.2 演示示例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <process.h>
int main()
{
const wchar_t* cmdname = L"java.exe";
const wchar_t* arg0 = L"java.exe";
const wchar_t* arg1 = L"-version";
// 同步启动新进程,等待子进程完成
int mode = _P_WAIT;
// 启动新进程
int result = _wspawnlp(mode, cmdname, arg0, arg1, NULL);
// 打印子进程的退出代码
printf("\nChild process exited with code %d\n", result);
return 0;
}
3.3 运行结果
4. _wspawnlpe
4.1 函数说明
int _wspawnlpe(int mode, const wchar_t* cmdname, const wchar_t* arg0, ... , const wchar_t* envptr[]);
用于启动一个新进程并运行指定的可执行文件。它与 _wspawnle
函数类似,但参数列表略有不同
参数:
- mode : 启动命令的模式,可以是
_P_WAIT
或_P_NOWAIT
的任意一种:
_P_WAIT
:等待新进程结束之后才继续执行当前进程_P_NOWAIT
:不等待新进程结束,立即返回并继续执行当前进程- cmdname : 要执行的可执行文件的名称,可以包含完整路径或者只有文件名。如果只有文件名,则会在环境变量
PATH
指定的目录中查找可执行文件- arg0 : 可选,第一个命令行参数字符串
- ... : 可选,用于传递命令行参数的可变参数列表,必须以一个
NULL
结尾- envptr: 可选,包含所有需要在子进程中使用的环境变量。如果为
NULL
,则子进程使用调用进程的当前环境
4.2 演示示例
4.2.1 SubEnvTest.c
参考 2.2.1 中所示即可,不再赘述
4.2.2 Test.c
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <process.h>
int main()
{
const wchar_t* cmdname = L"SubEnvTest.exe";
const wchar_t* arg0 = L"SubEnvTest.exe";
const wchar_t* arg1 = L"Huazie";
const wchar_t* arg2 = L"helloworld";
const wchar_t* envp[] = { L"key=value", NULL };
// 同步启动新进程,等待子进程完成
int mode = _P_WAIT;
// 启动新进程
int result = _wspawnlpe(mode, cmdname, arg0, arg1, arg2, NULL, envp);
// 打印子进程的退出代码
printf("Child process exited with code %d\n", result);
return 0;
}
4.3 运行结果
5. _wspawnv
5.1 函数说明
int _wspawnv(int mode, const wchar_t* cmdname, const wchar_t* const argv[]);
用于启动一个新进程并运行指定的可执行文件
参数:
- mode : 启动命令的模式,可以是
_P_WAIT
或_P_NOWAIT
的任意一种:
_P_WAIT
:等待新进程结束之后才继续执行当前进程_P_NOWAIT
:不等待新进程结束,立即返回并继续执行当前进程- cmdname : 要执行的可执行文件的名称,可以包含完整路径或者只有文件名。如果只有文件名,则将从当前工作目录中查找可执行文件。如果当前工作目录中没有找到该文件,则将失败并返回错误代码。
- argv : 要传递给子进程的命令行参数。该数组中最后一个元素必须是
NULL
5.2 演示示例
5.2.1 SubTest.c
参考 1.2.1 中所示即可,不再赘述
5.2.2 Test.c
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <process.h>
int main()
{
const wchar_t* cmdname = L"SubTest.exe";
const wchar_t* argv[] = { L"SubTest.exe", L"Huazie", NULL };
// 同步启动新进程,等待子进程完成
int mode = _P_WAIT;
// 启动新进程
int result = _wspawnv(mode, cmdname, argv);
// 打印子进程的退出代码
printf("\nChild process exited with code %d\n", result);
return 0;
}
5.3 运行结果
6. _wspawnve
6.1 函数说明
int _wspawnve(int mode, const wchar_t* cmdname, const wchar_t* const argv[], const wchar_t* const envp[]);
用于启动一个新进程并运行指定的可执行文件
参数:
- mode : 启动命令的模式,可以是
_P_WAIT
或_P_NOWAIT
的任意一种:
_P_WAIT
:等待新进程结束之后才继续执行当前进程_P_NOWAIT
:不等待新进程结束,立即返回并继续执行当前进程- cmdname : 要执行的可执行文件的名称,可以包含完整路径或者只有文件名。如果只有文件名,则将从当前工作目录中查找可执行文件。如果当前工作目录中没有找到该文件,则将失败并返回错误代码。
- argv : 要传递给子进程的命令行参数。该数组中最后一个元素必须是
NULL
- envp: 可选,包含所有需要在子进程中使用的环境变量。如果为
NULL
,则子进程使用调用进程的当前环境
6.2 演示示例
6.2.1 SubEnvTest.c
参考 2.2.1 中所示即可,不再赘述
6.2.2 Test.c
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <process.h>
int main()
{
const wchar_t* cmdname = L"SubEnvTest.exe";
const wchar_t* argv[] = { L"SubEnvTest.exe", L"Huazie", L"helloworld", NULL };
const wchar_t* envp[] = { L"key=value", NULL };
// 同步启动新进程,等待子进程完成
int mode = _P_WAIT;
// 启动新进程
int result = _wspawnve(mode, cmdname, argv, envp);
// 打印子进程的退出代码
printf("Child process exited with code %d\n", result);
return 0;
}
6.3 运行结果
7. _wspawnvp
7.1 函数说明
int _wspawnvp(int mode, const wchar_t* cmdname, const wchar_t* const argv[]);
用于启动一个新进程并运行指定的可执行文件
参数:
- mode : 启动命令的模式,可以是
_P_WAIT
或_P_NOWAIT
的任意一种:
_P_WAIT
:等待新进程结束之后才继续执行当前进程_P_NOWAIT
:不等待新进程结束,立即返回并继续执行当前进程- cmdname : 要执行的可执行文件的名称,可以包含完整路径或者只有文件名。如果只有文件名,则会在环境变量
PATH
指定的目录中查找可执行文件- argv : 要传递给子进程的命令行参数。该数组中最后一个元素必须是
NULL
7.2 演示示例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <process.h>
int main()
{
const wchar_t* cmdname = L"java.exe";
const wchar_t* argv[] = { L"java.exe", L"-version", NULL };
// 同步启动新进程,等待子进程完成
int mode = _P_WAIT;
// 启动新进程
int result = _wspawnvp(mode, cmdname, argv);
// 打印子进程的退出代码
printf("\nChild process exited with code %d\n", result);
return 0;
}
7.3 运行结果
8. _wspawnvpe
8.1 函数说明
int _wspawnvpe(int mode, const wchar_t* cmdname, const wchar_t* const argv[], const wchar_t* const envp[]);
用于启动一个新进程并运行指定的可执行文件
参数:
- mode : 启动命令的模式,可以是
_P_WAIT
或_P_NOWAIT
的任意一种:
_P_WAIT
:等待新进程结束之后才继续执行当前进程_P_NOWAIT
:不等待新进程结束,立即返回并继续执行当前进程- cmdname : 要执行的可执行文件的名称,可以包含完整路径或者只有文件名。如果只有文件名,则会在环境变量
PATH
指定的目录中查找可执行文件- argv : 要传递给子进程的命令行参数。该数组中最后一个元素必须是
NULL
- envp: 可选,包含所有需要在子进程中使用的环境变量。如果为
NULL
,则子进程使用调用进程的当前环境
8.2 演示示例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <process.h>
int main()
{
const wchar_t* cmdname = L"java.exe";
const wchar_t* argv[] = { L"java.exe", L"-version", NULL };
const wchar_t* envp[] = { L"key=value", NULL };
// 同步启动新进程,等待子进程完成
int mode = _P_WAIT;
// 启动新进程
int result = _wspawnvpe(mode, cmdname, argv, envp);
// 打印子进程的退出代码
printf("Child process exited with code %d\n", result);
return 0;
}
8.3 运行结果
9. _wsystem
9.1 函数说明
int _wsystem(const wchar_t* command);
用于执行操作系统命令。它会启动一个新进程来执行指定的命令,并等待该进程完成。在命令执行过程中,父进程将会被阻塞。
参数:
- command: 要执行的命令字符串,可以是一个简单的命令名或者是一个完整的命令行
返回值:
- 如果命令执行成功,则返回执行命令后的退出代码;
- 如果命令执行失败,则返回一个负数。
9.2 演示示例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <process.h>
int main()
{
const wchar_t* command = L"cmd /c copy file1.txt file2.txt";
// 执行命令
int result = _wsystem(command);
// 检查命令是否执行成功
if (result == -1) {
wprintf(L"Failed to run command.\n");
return 1;
}
// 打印命令的退出代码
wprintf(L"Command exited with code %d\n", result);
return 0;
}
9.3 运行结果
运行前: 运行后:
10. _wsearchenv
10.1 函数说明
int _wsearchenv(const wchar_t* file, const wchar_t* envvar, wchar_t* pathname);
用于在指定的路径中查找指定的文件名
参数:
- file : 要查找的文件名
- envvar: 可选参数,可以用来指定一个环境变量名,该环境变量包含一个路径列表,其中包括要搜索的文件所在的路径。如果未提供环境变量名,则函数将仅搜索当前工作目录。
- pathname : 存储找到的文件的完整路径的缓冲区。如果找到了文件,则将完整路径复制到这个缓冲区中
返回值:
- 如果找到了指定的文件,则返回一个
非零值
;- 否则返回
0
注意: 该函数会先在当前工作目录中搜索指定的文件名,如果找不到,则按照提供的路径列表逐一搜索,直到找到为止。
10.2 演示示例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#define MAX_PATH 200
int main()
{
const wchar_t* file = L"notepad.exe";
wchar_t path[MAX_PATH];
// 在 PATH 环境变量中查找文件
_wsearchenv(file, L"PATH", path);
// 打印文件的完整路径
wprintf(L"Found file at: %ls\n", path);
return 0;
}
10.3 运行结果
11. _wsplitpath
11.1 函数说明
void _wsplitpath(const wchar_t* path, wchar_t* drive, wchar_t* dir, wchar_t* fname, wchar_t* ext);
用于将路径名分解为其组成部分:驱动器、目录、文件名和扩展名
参数:
- path : 要分解的路径名
- drive : 用于存储驱动器号的缓冲区。如果路径名没有驱动器号,则该缓冲区将包含空字符串
- dir : 用于存储目录部分的缓冲区。如果路径名中不包含目录,则该缓冲区将包含空字符串
- fname : 用于存储文件名部分的缓冲区。如果路径名中既不包含文件名也不包含扩展名,则该缓冲区将包含空字符串
- ext : 用于存储扩展名部分的缓冲区。如果路径名中不包含扩展名,则该缓冲区将包含空字符串
11.2 演示示例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
int main()
{
const wchar_t* path = L"C:\\Windows\\system32\\notepad.exe";
wchar_t drive[_MAX_DRIVE];
wchar_t dir[_MAX_DIR];
wchar_t fname[_MAX_FNAME];
wchar_t ext[_MAX_EXT];
_wsplitpath(path, drive, dir, fname, ext);
wprintf(L"Drive: %ls\n", drive);
wprintf(L"Directory: %ls\n", dir);
wprintf(L"Filename: %ls\n", fname);
wprintf(L"Extension: %ls\n", ext);
return 0;
}
11.3 运行结果
12. _wunlink
12.1 函数说明
int _wunlink(const wchar_t* filename);
用于删除指定的文件
参数:
- filename : 要删除的文件的完整路径名
返回值:
- 如果删除成功,则返回值为
0
;- 如果删除失败,则返回值为
-1
,并且设置了全局变量errno
来指示错误原因。
12.2 演示示例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
int main()
{
const wchar_t* filename = L"myfile.txt";
// const wchar_t* filename = L"file1.txt";
int result = _wunlink(filename);
if (result != 0)
{
perror("Failed to delete file ");
return 1;
}
printf("File deleted successfully.\n");
return 0;
}
注意: 在实际应用中,我们需要小心谨慎使用
_wunlink()
函数,因为它会永久性地删除文件,而且无法撤销。