从父进程,我试图通过标准输入/输出控制子进程。我使用以下 MSDN 示例创建子进程并重定向其标准输入和输出:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms682499%28v=vs.100%29.aspx
在父端,我使用以下代码两次发送相同的“命令”:
const char cmd[] = "test\n";
DWORD written, read;
BOOL success;
success = WriteFile(g_hChildStd_IN_Wr, cmd, sizeof(cmd), &written, NULL);
success = WriteFile(g_hChildStd_IN_Wr, cmd, sizeof(cmd), &written, NULL);
在孩子方面,我通过fgets调用读取了这些命令。第一个命令按预期读取。但是当发送第二个命令时, fgets 调用返回一个空字符串,并且下一个 fgets 调用不返回。这是子进程代码:
char *retStrP;
char str[256];
size_t strLen;
retStrP = fgets(str, 256, stdin);
strLen = strlen(str);
if (retStrP != str)
{
char errorStr[256];
int a = feof(stdin);
int b = ferror(stdin);
sprintf(errorStr, "Fgets error, %d %d\n", a, b);
OutputDebugString(errorStr);
}
else if (strLen == 0)
{
char errorStr[256];
int a = feof(stdin);
int b = ferror(stdin);
sprintf(errorStr, "Strlen is 0, %d %d\n", a, b);
OutputDebugString(errorStr);
}
从前面的代码中,对 fgets 的第二次调用的行为如下:返回的指针等于 str 缓冲区,但 strlen 为 0。
在阅读 MSDN fgets 文档(http://msdn.microsoft.com/en-us/library/c37dh6kf%28v=vs.100%29.aspx)时,我看不出有任何方法可以将指针返回到缓冲区作为第一个参数传递,第一个缓冲区的字节设置为 0(只要缓冲区大小大于 1)。如果发生错误或到达文件末尾,fgets 应该返回 NULL 并且 feof 或 ferror 应该返回不为 0 的值。
我怀疑管道处理出了点问题,但我不知道是什么......从父方来看,除了发送相同的缓冲区两次之外,我对标准输入写入管道没有做任何事情。知道什么会导致这种行为吗?