我试图将为POSIX编写的Fortran代码移植到Windows。据我所见,大多数程序都可以在Windows上编译,只需要修改几个小命令。
在程序的fortran部分中,有一行
call system("exec xmrcc >> output.log")
问题是,windows没有任何exec
命令。但是,经过一番研究,我发现在linux上,exec
命令使用底层的execvp()
调用。在Windows上,MSVC++提供_exec()
和相关函数系列。_execlp()
或_execlpe()
似乎是我想要的。
因此,我想用一个C函数替换fortran系统调用,这个函数将环绕execlpe()
并调用程序xmrcc.exe。
但是,我不知道这些函数是如何工作的!我读过Microsoft关于exec的文档,使用execl (论点)和C-在windows中使用exec()。在遵循最后一个链接问题的公认答案之后,我编写了这个C代码来测试_execlp()
#include <stdio.h>
#include <windows.h>
#include <process.h>
int main()
{
printf("started running");
_execlp("C::\\WINDOWS\\SYSTEM32\\CMD.EXE", "cmd.exe", "/c",
"echo", "foo",">G:\\Python\\foo.txt");
}
但是,在运行编译后的代码时,我只得到输出“开始运行”,然后返回;G:\Python中没有foo.txt文件。然后我想可能是输出重定向引起了问题,所以我删除了它:
_execlp("C::\\WINDOWS\\SYSTEM32\\CMD.EXE", "cmd.exe", "/c", "echo", "foo");
还是一无所获。它只打印“开始运行”,不打印"foo“。
我有两个主要问题:
_execlp()
上正确运行?(运行xmrcc.exe并将输出定向到日志)_execlpe()
来传递环境变量?(我不明白这是如何工作的)。我正在使用MicrosoftVisualC++ v19编译器。
[请不要提及锡格温,或交友或WSL,他们不是我要找的。我知道fortran中的系统调用是不受欢迎的,但我没有编写程序,我只是在移植它。
我需要使用_execlp()
,因为它完全用子进程替换调用进程,并且是最接近linux exec
命令的。这是必要的,因为程序的其他部分使用PIDS,因此必须不生成具有不同PID的子进程。]
编辑:删除exec命令有效吗?与call system("xmrcc >> output.log)
一样,@ChrisDodd的评论中也提到了这一点。
发布于 2021-04-27 11:59:18
有两件事需要修复:
因此,这是可行的:
_execlp("C:\\WINDOWS\\SYSTEM32\\cmd.EXE", "cmd.exe", "/c", "echo", "baz", ">c:\\test\\bar.txt", nullptr);
https://stackoverflow.com/questions/67273978
复制相似问题