C# 内存在两个进程之间共享,无法从一侧获取读取流
C# memory shared between two Processes, can't get Read stream from one side
我用 OS 本书的问题做了练习。我很难在两个进程之间实现共享内存。工作流程如下
一个进程(A)启动另一个进程(B)。那个,另一个过程(B),完成它的工作 - 称为 collatz 猜想(它只是一个迭代工作。)。为了分享 B 的工作,B 必须将他的工作写入流。
下面是我的源代码(A)。
namespace collatz_conjecture
{
class colltz_conjecture
{
static void Main(string[] args)
{
Console.WriteLine("===== Start Process =====");
MemoryMappedFile mmf = MemoryMappedFile.CreateNew("test", (long)1e5 );
Process child = new Process();
child.StartInfo.FileName = "child.exe";
child.Start();
child.WaitForExit();
using (MemoryMappedViewStream stream = mmf.CreateViewStream(0, (long)1e5))
{
StreamReader sr = new StreamReader(stream);
Console.WriteLine(sr.ReadLine());
Console.WriteLine("===== End of Process =====");
}
}
}
}
下面是源码B.
namespace child
{
class child
{
static void Main(string[] args)
{
Console.WriteLine("임의의 정수를 입력해주세요");
int n =Convert.ToInt32(Console.ReadLine());
try
{
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("test",MemoryMappedFileRights.Write))
{
using (MemoryMappedViewStream stream = mmf.CreateViewStream(0, (long)1e2))
{
StreamWriter sw = new StreamWriter(stream);
while (true)
{
sw.Write(n + " " );
Console.Write(n + " ");
if (n == 1) break;
if (n % 2 == 0) n /= 2;
else n = 3 * n + 1;
Thread.Sleep(500);
}
Console.WriteLine();
}
}
}
catch
{
while (true)
{
Console.Write("WHY IT DOESNT WORK????\n");
Thread.Sleep(500);
};
}
}
}
}
我想我当时做了我能做的。我复制了 msdn 的源代码 msdn's example,并粘贴到我的源代码中。它工作正常。
但是对于我的来源,A 只是打印出空字符串..
是否禁止在 MemoryMappedFile 中使用 streamReader?或者有什么问题
picture of two console, left one is A right one is B.
已解决。
事情是关于.... "StreamWriter"。我真的很抱歉,它不是 IPC。我发现 StreamWriter 应该遵循 Close 或 flush。所以我添加了 "sw.Flush()"
static void Main(string[] args)
{
Console.WriteLine("임의의 정수를 입력해주세요");
int n =Convert.ToInt32(Console.ReadLine());
try
{
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("test",MemoryMappedFileRights.Write))
{
using (MemoryMappedViewStream stream = mmf.CreateViewStream(0, (long)1e2))
{
StreamWriter sw = new StreamWriter(stream);
while (true)
{
sw.Write(n + " " );
Console.Write(n + " ");
if (n == 1) break;
if (n % 2 == 0) n /= 2;
else n = 3 * n + 1;
Thread.Sleep(500);
}
sw.Flush(); // <---- added
Console.WriteLine();
}
}
}
catch
{
while (true)
{
Console.Write("WHY IT DOESNT WORK????\n");
Thread.Sleep(500);
};
}
}
而且效果很好..
对不起。我认为我的要求不够好 post。但我希望我的问题,答案会帮助别人。
我用 OS 本书的问题做了练习。我很难在两个进程之间实现共享内存。工作流程如下
一个进程(A)启动另一个进程(B)。那个,另一个过程(B),完成它的工作 - 称为 collatz 猜想(它只是一个迭代工作。)。为了分享 B 的工作,B 必须将他的工作写入流。
下面是我的源代码(A)。
namespace collatz_conjecture
{
class colltz_conjecture
{
static void Main(string[] args)
{
Console.WriteLine("===== Start Process =====");
MemoryMappedFile mmf = MemoryMappedFile.CreateNew("test", (long)1e5 );
Process child = new Process();
child.StartInfo.FileName = "child.exe";
child.Start();
child.WaitForExit();
using (MemoryMappedViewStream stream = mmf.CreateViewStream(0, (long)1e5))
{
StreamReader sr = new StreamReader(stream);
Console.WriteLine(sr.ReadLine());
Console.WriteLine("===== End of Process =====");
}
}
}
}
下面是源码B.
namespace child
{
class child
{
static void Main(string[] args)
{
Console.WriteLine("임의의 정수를 입력해주세요");
int n =Convert.ToInt32(Console.ReadLine());
try
{
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("test",MemoryMappedFileRights.Write))
{
using (MemoryMappedViewStream stream = mmf.CreateViewStream(0, (long)1e2))
{
StreamWriter sw = new StreamWriter(stream);
while (true)
{
sw.Write(n + " " );
Console.Write(n + " ");
if (n == 1) break;
if (n % 2 == 0) n /= 2;
else n = 3 * n + 1;
Thread.Sleep(500);
}
Console.WriteLine();
}
}
}
catch
{
while (true)
{
Console.Write("WHY IT DOESNT WORK????\n");
Thread.Sleep(500);
};
}
}
}
}
我想我当时做了我能做的。我复制了 msdn 的源代码 msdn's example,并粘贴到我的源代码中。它工作正常。
但是对于我的来源,A 只是打印出空字符串..
是否禁止在 MemoryMappedFile 中使用 streamReader?或者有什么问题
picture of two console, left one is A right one is B.
已解决。 事情是关于.... "StreamWriter"。我真的很抱歉,它不是 IPC。我发现 StreamWriter 应该遵循 Close 或 flush。所以我添加了 "sw.Flush()"
static void Main(string[] args)
{
Console.WriteLine("임의의 정수를 입력해주세요");
int n =Convert.ToInt32(Console.ReadLine());
try
{
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("test",MemoryMappedFileRights.Write))
{
using (MemoryMappedViewStream stream = mmf.CreateViewStream(0, (long)1e2))
{
StreamWriter sw = new StreamWriter(stream);
while (true)
{
sw.Write(n + " " );
Console.Write(n + " ");
if (n == 1) break;
if (n % 2 == 0) n /= 2;
else n = 3 * n + 1;
Thread.Sleep(500);
}
sw.Flush(); // <---- added
Console.WriteLine();
}
}
}
catch
{
while (true)
{
Console.Write("WHY IT DOESNT WORK????\n");
Thread.Sleep(500);
};
}
}
而且效果很好..