0

编辑:这是整个代码,忽略罗马尼亚语注释。还有 2 或 3 个名字未翻译自罗马尼亚语: http: //pastebin.com/JjtayvXX

我正在尝试学习操作系统的基础知识,现在我正在使用 Windows 下的命名管道,但我不知道出了什么问题。

老实说,我正在研究一个朋友做过的例子,但他和我一样糟糕,如果不是更糟的话。虽然 hi 的程序有效(尽管它做了其他事情),但他无法解释任何事情,很可能只是从某个地方复制的,仍然......不重要,我想说的是我从示例中学习,而不是专业的.

服务器从客户端接收消息,返回最大和最小数字。

服务器.c:

#include "windows.h"
#include "stdio.h"

struct Msg {
int numbers[20];
int length;
};

...

int main () {

HANDLE inputPipe, outputPipe; 
Msg msg;

while (true) {

inputPipe = CreateNamedPipe ("\\\\.\\pipe\\Client2Server",
                 PIPE_ACCESS_INBOUND,
                 PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 
                 PIPE_UNLIMITED_INSTANCES,
                 0, //Numb of output bytes
                 sizeof(Msg),  // Numb of input bytes
                 0, // Wait forever
                 NULL); // Don't know how to use security

ConnectNamedPipe (inputPipe,NULL);

    // Here is where the server dies
    ReadFile (inputPipe, &msg,sizeof(Msg),NULL,NULL); 

现在Client.c:

struct Msg {
int numbers[20];
int length;
};


int main () {

HANDLE outputPipe, inputPipe;
Msg msg;

    // @misc: read data from keyboard, create msg   

outputPipe = CreateFile ("\\\\.\\pipe\\Client2Server",
            GENERIC_WRITE,
            FILE_SHARE_READ, // * comment after code
            NULL, // again, I know nothing about security attributes
            CREATE_ALWAYS, // either create or overwrite
            0,
            NULL);

// Here is where it dies
WriteFile (outputPipe, &msg, sizeof(Msg), NULL, NULL);

我得到访问冲突写入位置 0x00000000。不知道为什么。

  • 我希望这个进程只写,而另一个进程(服务器)只读。FILE_SHARE_READ可以吗?

另外我不知道如何处理 CreationDisposition / FlagsAndAttributes (最后 2 个参数CreateFile),它们可以吗?

4

1 回答 1

1

编辑:添加实际答案,参考其他主题,自己尝试过

WriteFile()'s第四个参数(指向将存储字节数的变量的指针)不应为空。根据 API 描述,如果第五个参数 , 不为空,则此参数只能为lpOverlapped空。

在此处查看类似主题: 为什么 WriteFile 在写入标准输出时会崩溃?


您可以检查/打印ReadFile()(failed if return = 0or FALSE) 和 client.c CreateFile()(failed if returns INVALID_HANDLE_VALUE) 的返回值,看看它们是否成功?

如果失败,能否GetLastError()在调用后立即打印出返回的值,以便我们看到具体的错误?

于 2012-11-25T15:27:31.953 回答