编辑:这是整个代码,忽略罗马尼亚语注释。还有 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
),它们可以吗?