【问题标题】:C# memory shared between two Processes, can't get Read stream from one side两个进程之间共享的 C# 内存,无法从一侧获取读取流
【发布时间】:2019-01-29 22:39:31
【问题描述】:

我在操作系统书的问题上做了练习。我很难在两个进程之间实现共享内存。工作流程如下。

一个进程(A)启动另一个进程(B)。而那个,另一个过程(B),做它的工作 - 称为 collat​​z 猜想(它只是一个迭代工作。)。为了分享 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.

【问题讨论】:

    标签: c# ipc shared-memory


    【解决方案1】:

    解决了。 问题是关于....“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);
                };
            }
         }
    

    而且效果很好..

    对不起。我认为我的要求不足以发布。但我希望我的提问,回答会对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多