C#内存在两个进程之间共享,无法从一侧获取读流

3

我在做一本操作系统书上的练习。我在实现两个进程之间的共享内存时遇到了困难。工作流程如下。

一个进程(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的示例),并将其粘贴到我的源代码中。它能够正常工作。
但是在我的源代码中,A只打印出空字符串...
使用StreamReader在MemoryMappedFile中被禁止了吗?还是有其他问题? 两个控制台的图片,左边是A,右边是B。
1个回答

3

问题已解决。这涉及到“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);
            };
        }
     }

它运行良好。

工作良好 对不起。我认为我的问题没有提得足够好,但我希望我的问题和答案能够帮助某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接