首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >fgets返回空

fgets返回空
EN

Stack Overflow用户
提问于 2012-11-06 17:43:47
回答 2查看 2.3K关注 0票数 0

从父进程中,我试图通过标准输入/输出来控制子进程。我使用以下MSDN示例创建子进程并重定向其标准输入和输出:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499%28v=vs.100%29.aspx

在父端,我使用以下代码两次发送相同的“命令”:

代码语言:javascript
运行
复制
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);

在子方面,我通过fget调用读取这些命令。第一个命令按预期读取。但是,当发送第二个命令时,fget调用将返回空字符串,而下一个fget调用不会返回。以下是子进程代码:

代码语言:javascript
运行
复制
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);
}

从前面的代码中,对fget的第二个调用的行为如下:返回的指针等于str缓冲区,但strlen为0。

在读取MSDN文档( http://msdn.microsoft.com/en-us/library/c37dh6kf%28v=vs.100%29.aspx )时,我认为它无法返回作为第一个参数传递的缓冲区的指针,第一个缓冲区的字节设置为0(缓冲区大小大于1)。如果发生错误或到达文件末尾,fget应返回NULL,而feof或feof应返回不为0的内容。

我怀疑管道处理出了什么问题,但我不知道.从父端来说,除了发送两次相同的缓冲区之外,我不会对stdin写管道做更多的事情。你知道是什么导致了这样的行为吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-07 17:49:29

我发现问题了!

从父进程中,WriteFile调用将空终止字符发送到管道。

因此,在第一个WriteFile调用之后,fget将字符串读入换行符。然后,在第二个WriteFile调用中,fget读取从前一个空终止字符直到第二个换行符的字符串。它将产生一个返回的字符串,第一个字符为空终止字符。这就是为什么fget返回时没有出现错误,但是字符串长度为0。

然后,解决方案是不通过从cmd缓冲区大小减去1来发送空终止字符。

票数 0
EN

Stack Overflow用户

发布于 2012-11-06 18:21:41

您的问题与链接to.Still的示例非常模糊地相关,以下是一些建议。

试试这个:

代码语言:javascript
运行
复制
while(!success)
   success = WriteFile(g_hChildStd_IN_Wr, cmd, sizeof(cmd), &written, NULL);
while(!success)
   success = WriteFile(g_hChildStd_IN_Wr, cmd, sizeof(cmd), &written, NULL);

原因:如果WriteFile()函数成功,则返回值为非零(TRUE)。如果函数失败,或正在异步完成,则返回值为零(FALSE)。若要获取错误信息,请使用GetLastError()函数。

在子进程中的for循环中,使用ReadFile()而不是fgets读取由WriteFile()编写的数据。

如果您仍然面临问题,请使用GetLastError()函数,在您的代码中WriteFile()ReadFile()之后,并发布您的错误代码信息。我们也许能更好地帮助你。

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

https://stackoverflow.com/questions/13256421

复制
相关文章

相似问题

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