1、背景
使用vscode编译运行下述测试代码:
#include <stdio.h>
#include <unistd.h>
int main()
{
int fd[2]; // 两个文件描述符
pid_t pid;
char buff[20];
if(pipe(fd) < 0) // 创建管道
printf("Create Pipe Error!\n");
if((pid = fork()) < 0) // 创建子进程
printf("Fork Error!\n");
else if(pid > 0) // 父进程
{
close(fd[0]); // 关闭读端
write(fd[1], "hello world\n", 12);
}
else
{
close(fd[1]); // 关闭写端
read(fd[0], buff, 20);
printf("%s", buff);
}
return 0;
}
发生报错:'fork' was not declared in this scope,'pipe' was not declared in this scope
2、原因
(1)使用fork()函数,需要添加头文件<unistd.h>
(2)但我已经添加了,却还是报错,那是因为,在 Windows 操作系统上,fork() 函数并不直接可用,因为它是 POSIX 标准中的一部分,而 Windows 并不完全支持 POSIX。并且,fork()函数是一个系统调用,并不是C++语言的一部分,所以该错误的发生和MinGW的配置没有关系。
3、解决
(1)放弃windows,切换Linux运行环境,因为Linux支持fork()这些POSIX函数
方法一简单粗暴,但是我舍不得vscode那么简洁美观的IDE,不考虑
(2)使用Windows API
方法二是逃避问题,我就想练习使用fork()还有pipe(),而不是windows自己的什么CreateProcess()、CreateNamePipe(),连参数都不一样,学鸡毛,放弃
(3)使用Cygwin替换MinGW
方法三CSDN上已有详细介绍,参考链接:在Windows环境下使用fork()函数的解决方案_windows下的fock()-CSDN博客
但是配置好像有一堆麻烦要处理,评论区也没几个拍马屁的,我又果断放弃
(4)安装Windows子系统WSL,因为WSL提供了类似Linux的运行环境
方法四看着很高级,就它了。关于如何使用WSL在Windows上安装Linux,参考链接:
我的实际安装过程:
重启电脑,打开ubuntu,设置Linux用户名和密码
这个Linux文件系统在windows下的实际路径是:
C:\Users\YourUserName\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\ext4.vhdx
回到vscode,提示安装新扩展WSL,点击安装
点击vscode左下角,选择WSL连接
点击底部显示终端,熟悉的linux界面,创建文件夹,新建刚刚的测试cpp文件
安装C/C++扩展,因为是新的运行环境,这是单独的硬盘分区,和原来的windows隔离了
安装code runner,我觉得这一步非常重要,因为只要装了这个就不需要配置复杂的task.json和launch.json,直接鼠标右击选择run code就能运行代码了,太省事了
新环境的GNU工具安装,终端输入下列命令:
sudo apt update
sudo apt install g++ gdb make ninja-build rsync zip
安装完g++需要进行配置,官方这部分的说明文档一大堆,实际卵用没有,只需要下面两步设置就好
然后右击鼠标,点击运行,成功!
4、补充
可能很多人需要task.json和launch.json的具体内容,所以在此补充
不使用code runner情况下,WSL环境下标准的vscode代码编译运行过程:
Terminal -> Run Build Task,配置task.json
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "compiler: /usr/bin/g++"
}
],
"version": "2.0.0"
}
Run -> Add Configuration,配置launch.json
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build active file"
}
]
}
点击F5,一样成功运行
5、结语
回过头来看,其实我最终还是选择的方法一,不过是披着windows外衣的linux罢了,最大的好处就是可以使用我那漂亮的vscode,ubuntu的界面我是怎么用怎么觉得丑
如果这篇文章对你有帮助,点个赞喽,有问题的话也欢迎指出^_^