- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
更新问题:所以我已经能够创建进程并编译程序。但是,我遇到了一个新问题。当我尝试将 Source 程序通过管道传输到 Filter 程序时。它似乎没有为接收器程序提供任何输入。没有错误信息。我还在 Windows 的 cmd 中使用管道运算符测试了我所有的独立程序。
我正在尝试做这个小项目来了解匿名管道和创建过程。我创建了 3 个独立的小程序,分别称为 Source、Filter 和 Sink。这 3 个已经编译并运行良好。以下是 3 个独立程序的说明。
Source:从命令行获取源文本文件文件名,打开文件,一次一个字符地读取文件内容并将其直接复制到标准输出 (stdout)。复制文件后,Source 终止(关闭所有打开的文件句柄)。
过滤器程序不使用任何文件名命令行参数。相反,Filter 从标准输入 (stdin) 读取文本文件并将所有大写字母转换为小写字母的输入副本写入标准输出 (stdout)。过滤器必须专门设计为读取一个字符,转换它,输出它,然后循环直到传入数据完成。
接收器程序从其命令行获取目标文本文件文件名,打开文件进行写入,然后从标准输入文件 (stdin) 一次读取一个字符,并将每个传入字符直接写入目标接收器文件。
接下来,我将单独驱动一个主驱动程序,该程序创建 2 个管道并生成 3 个独立的子级,其输入和输出配置为执行指定的并发执行和数据流。像这样:
驱动程序需要 2 个命令行参数:
C:\> Driver.exe srcfile destfile
其中 srcfile 是现有数据文本文件,destfile 是 Sink 应用程序要创建的新目标文件的文件名。
这是我的驱动程序代码。它还没有完成。但是我在尝试为 Source 程序创建进程时遇到了一个小问题。
更新代码:
#include <windows.h>
#include <WinBase.h>
#include <stdio.h>
#define DELAY_A_WHILE() {volatile long j; for(j = 1; j< 10000; j++) ; }
int main(int argc, char *argv[])
{
HANDLE hPipeRead, hPipeWrite, hPipeRead2, hPipeWrite2;
STARTUPINFO StartupInfoSource;
STARTUPINFO StartupInfoFilter;
STARTUPINFO StartupInfoSink;
PROCESS_INFORMATION ProcInfoSource;
PROCESS_INFORMATION ProcInfoFilter;
PROCESS_INFORMATION ProcInfoSink;
SECURITY_ATTRIBUTES PipeAttributes;
SECURITY_ATTRIBUTES PipeAttributes2;
char cmdline[200];
PipeAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
PipeAttributes.lpSecurityDescriptor = NULL; //ignore
PipeAttributes.bInheritHandle = TRUE; //child can inherit
//Create first pipe
if (!CreatePipe(&hPipeRead, &hPipeWrite, &PipeAttributes, 0)) {
fprintf(stderr, "Error creating pipe: %d\n", GetLastError());
exit(1);
}
sprintf_s(cmdline, 200, "Source.exe %s", argv[1]);
printf("Create process: %s\n", cmdline);
GetStartupInfo(&StartupInfoSource);
StartupInfoSource.dwFlags = StartupInfoSource.dwFlags | STARTF_USESTDHANDLES;
//Mapping
StartupInfoSource.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
StartupInfoSource.hStdOutput = hPipeWrite;
StartupInfoSource.hStdError = GetStdHandle(STD_ERROR_HANDLE);
if (!CreateProcess(
NULL, cmdline, NULL, NULL,
TRUE,
CREATE_NEW_CONSOLE, NULL, NULL,
&StartupInfoSource,
&ProcInfoSource))
{
fprintf(stderr, "Error creating child process: %d",GetLastError());
exit(1);
}
CloseHandle(hPipeWrite);
CloseHandle(ProcInfoSource.hProcess);
CloseHandle(ProcInfoSource.hThread);
PipeAttributes2.nLength = sizeof(SECURITY_ATTRIBUTES);
PipeAttributes2.lpSecurityDescriptor = NULL; //ignore
PipeAttributes2.bInheritHandle = TRUE; //child can inherit
//Create Second Pipe
if (!CreatePipe(&hPipeRead2, &hPipeWrite2, &PipeAttributes2, 0)) {
fprintf(stderr, "Error creating pipe: %d\n", GetLastError());
exit(1);
}
GetStartupInfo(&StartupInfoFilter);
StartupInfoFilter.dwFlags = StartupInfoFilter.dwFlags | STARTF_USESTDHANDLES;
//Mapping
StartupInfoFilter.hStdInput = hPipeRead;
StartupInfoFilter.hStdOutput = hPipeWrite2;
StartupInfoFilter.hStdError = GetStdHandle(STD_ERROR_HANDLE);
sprintf_s(cmdline, 200, "Filter.exe");
printf("Create process: %s\n", cmdline);
//Filter
GetStartupInfo(&StartupInfoFilter);
if (!CreateProcess(
NULL, cmdline, NULL, NULL,
TRUE,
CREATE_NEW_CONSOLE, NULL, NULL,
&StartupInfoFilter,
&ProcInfoFilter))
{
fprintf(stderr, "Error creating child process: %d", GetLastError());
exit(1);
}
// int exitStatus;
// GetExitCodeProcess(ProcInfoFilter.hProcess, &exitStatus);
CloseHandle(hPipeRead);
CloseHandle(hPipeWrite2);
CloseHandle(ProcInfoFilter.hProcess);
CloseHandle(ProcInfoFilter.hThread);
GetStartupInfo(&StartupInfoSink);
StartupInfoSink.dwFlags = StartupInfoSink.dwFlags | STARTF_USESTDHANDLES;
//Mapping
StartupInfoSink.hStdInput = hPipeRead2;
StartupInfoSink.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
StartupInfoSink.hStdError = GetStdHandle(STD_ERROR_HANDLE);
sprintf_s(cmdline, 200, "Sink.exe %s", argv[2]);
printf("Create process: %s\n", cmdline);
GetStartupInfo(&StartupInfoSink);
if (!CreateProcess(
NULL, cmdline, NULL, NULL,
TRUE,
CREATE_NEW_CONSOLE, NULL, NULL,
&StartupInfoSink,
&ProcInfoSink))
{
fprintf(stderr, "Error creating child process: %d", GetLastError());
exit(1);
}
CloseHandle(hPipeRead2);
CloseHandle(ProcInfoSink.hProcess);
CloseHandle(ProcInfoSink.hThread);
return 0;
}
程序编译正常。但是,当它尝试创建进程时,它总是失败并退出。 cmdline
解析时的值是“Source.exe test.txt”,这正是我用来执行独立源程序的内容。有人可以解释为什么我的 CreateProcess
失败了吗?是不是我解析错了参数?
最佳答案
我在这里看到的唯一问题是 Source.exe 应用可能不在 Driver.exe 所在的同一目录中。我尝试了您的代码,这是 CreateProcess 失败的唯一情况。
关于创建进程和匿名管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37428779/
所以 promises 对我来说是相当新的,但我喜欢这个想法。 之前... 我以前用过这个,它只在文件被完全读取并按预期工作后才简单地返回数据: function something{ fo
当我尝试编译时出现以下错误: In member function 'double search::IDAstar::dfs(const State&, double)': 153:18: erro
最接近下面的是什么?不幸的是,下面的方法名称编译错误。 int val = delegate(string s) { return 1; }("test"); 我也尝试了 (...)=>{..
1、评论提交超时: 大家可能会发现,在提交评论非常缓慢时最容易出现“匿名”现象,这种情况主要是由于评论提交时执行时间过长引起的,可能是装了比较耗时的插件(比如Akismet等);很多博
我想在同一个表中使用一个键插入一个匿名表,如下所示: loadstring( [[return { a = "One", b = a.." two" }]] ) 在我看来,这应该返回下表: {
有人知道免费的匿名 smtp 服务吗?我想让我的应用程序的用户能够偶尔向我发送一封匿名电子邮件,而无需配置输入他们电子邮件帐户的服务器。我想我可以为此目的设置一个 gmail 帐户并将凭据嵌入到应用程
我有这个数据补丁: ALTER TABLE MY_TABLE ADD new_id number; DECLARE MAX_ID NUMBER; BEGIN SELECT max(id)
假设我有以下数据框。 Person_info (Bob, 2) (John, 1) (Bek, 10) (Bob, 6) 我想通过保持它们的值(value)来匿名。 Person_info (Pers
根据多个国家/地区的法律要求,我们在日志文件中匿名化用户的 IP 地址。使用 IPv4,我们通常只是匿名化最后两个字节,例如。而不是 255.255.255.255我们记录255.255.\*.\*
我正在学习有关 Scala 的更多信息,但在理解 http://www.scala-lang.org/node/135 中的匿名函数示例时遇到了一些麻烦。 .我复制了下面的整个代码块: object
我正在开设一个 Commerce 网上商店。 我想添加 Commerce 愿望 list ,但现在该模块仅适用于注册用户,因为未注册它不起作用。 我将显示 block 中的角色设置为匿名,但即使在更改
我正在使用发现的 Google Apps 脚本 here让匿名用户将文件上传到我的 Google 云端硬盘。 我想要的是脚本使用表单上输入的名称创建一个文件夹,然后将文件存放在该文件夹中。 到目前为止
我遇到的情况是,我正在等待一些事件的发生。我看到很多关于如何使用命名函数使用 setTimeout 的好例子,但是有没有办法使用某种匿名方法来设置超时? 代码目前看起来像这样: testForObje
我一直在阅读一些关于 Android 内存泄漏的文章,并观看了来自 Google I/O 的这个有趣的视频 on the subject . 尽管如此,我仍然不完全理解这个概念,尤其是当它对用户安全或
我正在尝试适应 Spring JDBC,但让我烦恼的是使用这些匿名类,我们不能传递任何局部变量,除非它们是最终的,这可能很容易安排,但是如果我需要循环一个怎么办?数组还是集合?我无法将“FedMode
我正在尝试将数据输入到 Oracle 数据库中。这将是一个带有多个参数的存储过程……我的意思是像 27 个参数(别问,我没有设计它)…… 现在我必须以某种方式填充此存储过程的参数...存储过程采用的大
我之前问过这个问题:Combine a PartialFunction with a regular function 然后意识到,我实际上并没有问对。 所以,这是另一个尝试。 如果我这样做: va
我想从 C++ 执行一个匿名的 Qt 脚本函数,但不知道要使用的 QScriptContext。 这是脚本: { otherObject.Text = "Hello World"; setTi
我有一个返回 promise 的函数。 (本例中为 foo) 我尝试在声明为匿名的解析函数中调用此函数。 我已经尝试过使用this 但这不起作用。 我的代码是这样的 var foo = functio
这个问题的灵感来自这个 excellent example .我有 ASP.NET Core MVC 应用程序,我正在编写 unit tests为 Controller 。其中一种方法返回带有匿名类型
我是一名优秀的程序员,十分优秀!