首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Windows上与MSVC++一起使用exec()?

如何在Windows上与MSVC++一起使用exec()?
EN

Stack Overflow用户
提问于 2021-04-26 21:21:30
回答 1查看 640关注 0票数 0

我试图将为POSIX编写的Fortran代码移植到Windows。据我所见,大多数程序都可以在Windows上编译,只需要修改几个小命令。

在程序的fortran部分中,有一行

代码语言:javascript
代码运行次数:0
运行
复制
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()

代码语言:javascript
代码运行次数:0
运行
复制
#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文件。然后我想可能是输出重定向引起了问题,所以我删除了它:

代码语言:javascript
代码运行次数:0
运行
复制
    _execlp("C::\\WINDOWS\\SYSTEM32\\CMD.EXE", "cmd.exe", "/c", "echo", "foo");

还是一无所获。它只打印“开始运行”,不打印"foo“。

我有两个主要问题:

  1. 如何在_execlp()上正确运行?(运行xmrcc.exe并将输出定向到日志)
  2. 是否有必要使用_execlpe() 来传递环境变量?(我不明白这是如何工作的)。

我正在使用MicrosoftVisualC++ v19编译器。

[请不要提及锡格温,或交友或WSL,他们不是我要找的。我知道fortran中的系统调用是不受欢迎的,但我没有编写程序,我只是在移植它。

我需要使用_execlp(),因为它完全用子进程替换调用进程,并且是最接近linux exec命令的。这是必要的,因为程序的其他部分使用PIDS,因此必须不生成具有不同PID的子进程。]

编辑:删除exec命令有效吗?与call system("xmrcc >> output.log)一样,@ChrisDodd的评论中也提到了这一点。

EN

回答 1

Stack Overflow用户

发布于 2021-04-27 11:59:18

有两件事需要修复:

  1. 冒号:'C‘之后不应该加倍
  2. _execlp期望参数列表中有一个null来检测没有更多的参数。

因此,这是可行的:

_execlp("C:\\WINDOWS\\SYSTEM32\\cmd.EXE", "cmd.exe", "/c", "echo", "baz", ">c:\\test\\bar.txt", nullptr);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67273978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档