我必须io.popen在Lua中运行一个可执行文件,它接受一个命令行参数.如何等待流程在Lua中完成,以便捕获预期的输出?
local command = "C:\Program Files\XYZ.exe /all"
hOutput = io.popen(command)
print(string.format(""%s", hOutput))
Run Code Online (Sandbox Code Playgroud)
假设可执行文件是XYZ.exe,需要使用命令行参数调用/all.
一旦io.popen(command)执行,该过程将返回一些需要打印的字符串.
我的代码片段:
function capture(cmd, raw)
local f = assert(io.popen(cmd, 'r'))
-- wait(10000);
local s = assert(f:read('*a'))
Print(string.format("String: %s",s ))
f:close()
if raw then return s end
s = string.gsub(s, '^%s+', '')
s = string.gsub(s, '%s+$', '')
s = string.gsub(s, '[\n\r]+', ' ')
return s
end
local command = capture("C:\Tester.exe /all")
Run Code Online (Sandbox Code Playgroud)
我们将不胜感激.
我最近有机会为我的项目编写一个简单的tcp-client,由于我对tcp/ip的巨大无知,我很难让它正常工作.
我发现有时候当tcp服务器关闭时连接被拒绝或者有时在调用receive时我可能会遇到异常时,我会遇到奇怪的连接问题.
由于tcp-server是一个黑盒子,我们无法访问它,我想知道在这种情况下,为此编写单元测试的最佳方法是什么?
我想要么我应该写一个tcp-server并让它返回某些输入,就像我期望从真实服务器那样,或者只是模拟与返回理想情况数据相关的函数.
我只是不喜欢这样的事实:有时我可能会遇到奇怪的连接/接收问题而且我想知道如何正确编写单元测试,我可以在将来重复使用/扩展以确保之前工作的所有内容仍然有效以防我的代码或代码发生变化.
谢谢
我目前正在实现一个小调试框架的最后一个任务,即HW Breakpoints.到目前为止我提到了这篇文章:http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspx和一本关于编写调试器的书.
到目前为止,我有两个函数用于设置HW断点:
void debuglib::breakpoints::hw_bp() {
HANDLE helper = 0;
CONTEXT co;
CURRENTCONTEXT(co);
helper = ::CreateThread(0,0,threadfunc,reinterpret_cast<void*>(co.Eip),0,0);
DWORD status = ::WaitForSingleObject(helper,INFINITE);
if (status != WAIT_OBJECT_0) {
::MessageBoxA(0, "Helper thread didn't exit cleanly", "HWBreakpoint", MB_OK);
}
::CloseHandle(helper);
}
Run Code Online (Sandbox Code Playgroud)
static DWORD WINAPI debuglib::breakpoints::threadfunc(void* param) {
DWORD suspendcnt = ::SuspendThread(debuglib::process::thread());
if(suspendcnt) {
return 0;
}
CONTEXT co;
::ZeroMemory(&co,sizeof(co));
co.ContextFlags = CONTEXT_DEBUG_REGISTERS;
BOOL ok = ::GetThreadContext(debuglib::process::thread(),&co);
if(!ok) {
return 0;
}
DWORD freeDr = 0;
DWORD condition = debuglib::breakpoints::TRIGGER::CODE;
DWORD length …Run Code Online (Sandbox Code Playgroud) 从服务器存储库中取出后,我从本地工作仓库导出了一堆更改集.为了确保补丁工作,我从服务器克隆了一个新的repo,我尝试应用变更集.不幸的是,导入失败了:
applying G:\OSS\premake-dev\premake-dev_rev493.patch
unable to find 'src/host/scripts.c' for patching
3 out of 3 hunks FAILED -- saving rejects to file src/host/scripts.c.rej
patching file src/base/api.lua
patching file src/host/scripts.c
patching file src/tools/bcc.lua
file tests/test_bcc.lua already exists
1 out of 1 hunks FAILED -- saving rejects to file tests/test_bcc.lua.rej
patching file tests/premake4.lua
patching file tests/test_bcc.lua
abort: patch failed to apply
[command interrupted]
Run Code Online (Sandbox Code Playgroud)
我知道失败的原因,这是由于最新变更集中不再存在已删除的源文件.但是我不确定如何修复我的补丁,以便它可以干净地应用于当前的服务器存储库.
我对Mercurial很新,所以使用的一些术语我不会熟悉.另请注意,我没有对Hg服务器存储库的写访问权限.因此,为了获得我的变更集,我必须将其作为补丁导出并将其提交给维护者.
我正在编写一个使用Lua套接字与http服务器通信的程序.我使用的API是"socket.http.request",我发现它是同步的.我的理解是,它等待它得到一些响应或超时.我的理解是否正确?如果是这样,我宁愿使用异步API.
我还发现了另一个API"socket.http.request_cb",它在处理请求时调用了一个回调函数.但是,它似乎不适用于此.(这个API在我正在使用的版本上不可用.)我在这里使用Lua 5.1和Lua socket 2.0.2.谁能让我知道哪个版本的Lua或Lua套接字有这个API?
在C++中,这个表达式将被编译,并且在运行时将打印test:
if(!1 >= 0) cout<<"test";
Run Code Online (Sandbox Code Playgroud)
但在Java中,这将无法编译:
if(!1 >= 0) System.out.println("test");
Run Code Online (Sandbox Code Playgroud)
而是需要括号:
if(!(1>=0)) System.out.println("test");
Run Code Online (Sandbox Code Playgroud)
但是test不会打印,因为1 >= 0是真的,而NOT真的是假的.
那么为什么它test在C++中编译和打印出来,即使该语句是错误的,但不是在Java中?
谢谢你的帮助.
我正在尝试在Azure WebApp上使用StackExchange.Redis并需要运行一些Lua脚本.
建议的方法是将脚本加载到服务器,但我很难理解正确的模式.
我认为应该做的方式是在WebApp初创公司:
LuaScript luaScript = LuaScript.Prepare(scriptString);
var endpoints = redis.GetEndPoints();
var endpoint = endpoints[0];
IServer server = redis.GetServer(endpoint);
LoadedLuaScript loadedScript = luaScript.Load(server);
Run Code Online (Sandbox Code Playgroud)
然后保留LoadedLuaScript供以后使用(与ConnectionMultiplexer一起使用).然后当我想运行Lua脚本时:
IDatabase db = redis.GetDatabase();
db.ScriptEvaluate(loadedScript);
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?
由于Azure可以有多个Redis节点,我应该为每个端点运行luaScript.Load并只保留其中一个以供以后使用吗?即:
LuaScript luaScript = LuaScript.Prepare(script);
var endpoints = redis.GetEndPoints();
LoadedLuaScript loadedScript;
foreach (var endpoint in endpoints)
{
IServer server = redis.GetServer(endpoint);
loadedScript = luaScript.Load(server);
}
return loadedScript;
Run Code Online (Sandbox Code Playgroud) 在我用其他语言工作的所有项目中,支撑风格的选择是Allman Style(又名ANSI风格).在Go中工作时,缺少自由形式的支撑样式(括号也是)我从其他C语言语法系列中遗漏的东西.
任何人都可以想出一种让Go编译器接受以下支撑风格的方法吗?
package main
import "fmt"
func main()
{
f()
fmt.Println("Returned normally from f.")
}
func f()
{
fmt.Println("In function f.")
}
Run Code Online (Sandbox Code Playgroud)
注意我知道为什么Go设计有这样的人为"限制"的论据,但我并没有真正购买它.我坚信,所使用的支撑式风格应该真正由在代码库上工作的人或公司所采用的编码标准来决定,而不是被语言本身所强迫.
因此,请在"如何做"的范围内考虑我的问题,而不是"为什么不去做,只是适应".
谢谢
因此,我理解它正确实现RAII,如果我在哪里调用CreateFont,我将它包装CreateFont在构造函数和DeleteObject析构函数中的类中,所以当它超出范围时它会清理它.
第一个问题是,我最终会不会有大量的课程吗?特别是因为类只有构造函数和析构函数.
第二个问题是,如果我在WndProc中调用CreateFont类,那么它会不断超出范围.我应该在WndMain 做我所有的电话CreateFont或喜欢LoadBitmap吗?我习惯于调用这些功能WM_CREATE并清理它们WM_DESTROY.
在C++中,system()和之间的主要区别是shellexecute()什么?
在什么情况下我应该使用system()和shellexecute()?
c++ ×4
lua ×3
winapi ×2
breakpoints ×1
c# ×1
coding-style ×1
go ×1
java ×1
luasocket ×1
mercurial ×1
popen ×1
raii ×1
tcp-ip ×1
tortoisehg ×1
unit-testing ×1
windows ×1