我练习了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?还是什么问题
答案 0 :(得分:2)
已解决。 事情是关于..“ StreamWriter”的。非常遗憾,这不是IPC。我发现StreamWriter应该遵循“关闭”或“刷新”。所以我添加了“ 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);
};
}
}
而且效果很好..