MS_InterProcessCommunication - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- æ»ãïŒãã®ä»ãéçºã®è²ã ïŒ
ããã»ã¹ééä¿¡ã«ã€ããŠãŸãšããã
è£è¶³ïŒIPC ã®éžæè»žïŒ: ææ®µãå€ãã®ã§ã
**å ã«ãäœã§éžã¶ãã**ãæŽçããŠãããšèªã¿ãããã
軞 å 容 åäžãã·ã³ãããããã¯ãŒã¯è¶ãã å ±æã¡ã¢ãªã»ãã€ãã¯åäžãã·ã³éå®ãTCP ã¯è·šãã 芪åé¢ä¿ãããã å¿åãã€ãã¯èŠªåéå®ãååä»ããªãç¡é¢ä¿ã§ããã é床 å ±æã¡ã¢ãª ïŒ ãã€ã ïŒ ããŒã«ã« TCP ããŒã¿é 倧éã»é«é »åºŠãªãå ±æã¡ã¢ãªïŒå°ããªã¡ãã»ãŒãžãªããã€ã æ¹å äžæ¹åãåæ¹åã ãã©ãããã©ãŒã Windows å°çšããLinux ã§ãåãã â ãéžæã®ç®å®ã 芪ããã»ã¹ãåãèµ·åããŠå¶åŸ¡ããã â å¿åãã€ã / æšæºå ¥åºå åžžé§ãµãŒãã¹ãš GUI ãéä¿¡ããïŒåäž PCïŒ â ååä»ããã€ã 倧éããŒã¿ãé«éã«å ±æãã â å ±æã¡ã¢ãª å¥ãã·ã³ã«ãå±éããå¯èœæ§ããã â ãTCP / HTTP / gRPCãâ Linux ã³ã³ããã§ãåãã â TCP / Unix ãã¡ã€ã³ ãœã±ããæåŸã® 2 ã€ãçŸåšã§ã¯éèŠã§ããã
ãåäžãã·ã³åæã® IPCãã¯ã³ã³ããåã»ã¯ã©ãŠãç§»è¡ã§è¶³æ·ã«ãªãããã
è¿·ã£ãã TCPïŒããã㯠HTTP / gRPCïŒã«ããŠããæ¹ã寿åœãé·ãã
- å ±æã¡ã¢ãªããã€ãïŒååä»ã/å¿åïŒãTCP, UDP ãªã©ãããã
- åããã»ã¹ãšã®éä¿¡ãªãå¿åãã€ãã䜿çšãããšè¯ãã
- å éšçã«ã¯ãããŒãžã³ã°ãã¡ã€ã«ã«æ¯æãããã¡ã¢ãªããããã»ãã¡ã€ã«ã䜿çšããã
- å®è£
ã«ã€ããŠã¯ãäžèšã®ãSharedMem.xaml.csããåç
§ã®ããšã
ãã ããTouryo.Infrastructure.Public.Util.SharedMemory ã«äŸåããŠããã
ç§»è¡ã¡ã¢ïŒãããŒãžã³ã°ãã¡ã€ã«ã«æ¯æããããïŒ: åæã®è¡šçŸã¯
**ãããŒãž ãã¡ã€ã«ã«ãã£ãŠããã¯ãããïŒbacked by the page fileïŒã**ã®
èš³ãšèªãããå å®¹ã¯æ£ç¢ºã§ããããã¡ã¢ãª ãããã ãã¡ã€ã«ã® 2 圢æ ã â ããã¡ã€ã«ã«ããã¯ãããã å®ãã¡ã€ã«ãã¡ã¢ãªã«ååãã â 倧ããªãã¡ã€ã«ã®äžéšã ããèªã¿æžãã§ãã â¡ ãããŒãž ãã¡ã€ã«ã«ããã¯ããããâ å ±æã¡ã¢ãªã¯ãã¡ã å®ãã¡ã€ã«ãæãããååã ããä»ãã â ããã»ã¹éã§ãååããå ±æããã°ãåãé åãèŠããã â ããã»ã¹ãå šéšçµäºãããšæ¶ãã// .NET ã§ã®å ±æã¡ã¢ãªïŒSystem.IO.MemoryMappedFilesïŒ // æžãåŽ using var mmf = MemoryMappedFile.CreateOrOpen("MySharedMem", 1024); using var acc = mmf.CreateViewAccessor(); acc.Write(0, 12345); // èªãåŽïŒå¥ããã»ã¹ïŒ using var mmf2 = MemoryMappedFile.OpenExisting("MySharedMem"); using var acc2 = mmf2.CreateViewAccessor(); Console.WriteLine(acc2.ReadInt32(0));å ±æã¡ã¢ãªåºæã®æ³šæç¹:
â ãåæãèªåã§è¡ãå¿ èŠããããâ å ±æã¡ã¢ãªèªäœã¯ãåæã«æžãããã©ããªããããä¿èšŒããªã â Mutex / SemaphoreïŒååä»ãïŒã§æä»ãã â¡ ãã»ãã·ã§ã³åé¢ãïŒ[ïŒãã°ãªã³ïŒã»ãã·ã§ã³](MS_LogonSession)ïŒ ãµãŒãã¹ïŒSession 0ïŒãšãŠãŒã¶ãŒ ã¢ããªã§åå空éãéã â "Global\\MySharedMem" ãš Global åå空éãæç€ºãã â [Windowsã®å€å](MS_WindowsGaiji) ã® Session 0 åé¡ãšåæ ¹ ⢠ãã¯ãã¹ ãã©ãããã©ãŒã ã ååä»ãå ±æã¡ã¢ãªã¯ .NET Core ã® Linux ã§ã¯æªå¯Ÿå¿ â Linux ã§ãåãããªãããã®æ¹åŒã¯éžã¹ãªã
-
ååä»ããã€ã
-
ååä»ããã€ãã䜿çšããŠãããã»ã¹ééä¿¡ãè¡ãå Žåã
ãã€ãã»ãªããžã§ã¯ãã®å§ç¹ãšçµç«¯ãïŒããã»ã¹éã§æã€ã -
ãã®ãšãããã€ãã»ãªããžã§ã¯ãã ID ã®ãããªãã®ã§
èå¥ããã®ããååä»ããã€ãã«ãªãã -
åŸã£ãŠãååä»ããã€ãã®å Žåã
ïŒããã»ã¹ããã€ãåãå ±æããŠããå¿ èŠãããã -
詳现ã«ã€ããŠã¯ãäžèšã®ãNdPipe.xaml.csããåç §ã®ããšã
-
-
å¿åãã€ã
-
äžæ¹ãå¿åãã€ãã¯ãååãç¡ãã®ã§ãååã§å ±æã§ããªãã
-
ãã®ä»£ãã«ã芪ããã»ã¹åŽãããåããã»ã¹åŽã«ããã³ãã©ãè€è£œããŠæž¡ãã
ïŒåŸã£ãŠãå¿åãã€ãã¯ã芪åããã»ã¹ééä¿¡ã§ã®å©çšãäžè¬çã«ãªãïŒ -
ãã®ãã³ãã©ã®è€è£œã«ã
- Windows OS ã§ã¯ãDuplicateHandle 颿°ã䜿çšãã
- Unix ç³» OS ã§ã¯ãfork 颿°ã䜿çšããã
-
åè
-
[ Cèšèª ] ããã»ã¹ã®çæ ( fork ) ãš ãã€ãã«ãã
ããã»ã¹ééä¿¡ ( pipe ) â è¡ãïŒåå·®å€40ããã°ã©ããŒ
http://hensa40.cutegirl.jp/archives/1032 -
芪ããã»ã¹ã»åããã»ã¹ééä¿¡ - Qiita
https://qiita.com/SoyaTakahashi/items/f28d0b5ef404afd339fa -
.NET ã§ã¯ããã®ãã³ãã©ã®è€è£œã«ã
https://github.com/OpenTouryoProject/SampleProgram/blob/master/Other/PipesFamilyHouse/AnonymousPipe/Parent/Program.cs#L77
HandleInheritability.Inheritable ã䜿çšããŠããã
ããã¯ãå éšïŒWin32ïŒçã«ãDuplicateHandle 颿°ãšæãããã
-
-
è£è¶³ïŒåæã®æšæž¬ã¯æŠãæ£ããïŒ: ãå éšïŒWin32ïŒçã«ã
DuplicateHandle 颿°ãšæãããããšããæšæž¬ã¯ãæ¹åãšããŠæ£ããã
ãã ããããå°ãæ£ç¢ºã«ããŠããããHandleInheritability.Inheritable ã®å®äœã â ãã³ãã«ãäœãéãSECURITY_ATTRIBUTES.bInheritHandle = TRUE ãæå® â ããã®ãã³ãã«ã¯åã«ç¶æ¿ã§ããããšããå°ãä»ãã â¡ CreateProcess ã bInheritHandles = TRUE ã§åŒã¶ â ãOS ãç¶æ¿å¯èœãªãã³ãã«ããŸãšããŠè€è£œãããâ â DuplicateHandle ãæç€ºçã«åŒã¶ããã§ã¯ãªããã OS å éšã§è¡ãããã®ã¯å®è³ªçã«åãè€è£œåŠçã§ãã
forkãšã®éããè£è¶³ããŠããããUnix ã® forkã ããã»ã¹ãäžžããšè€è£œãã â ãã¡ã€ã«èšè¿°åããèªåçã«åŒãç¶ãããã â ãã€ããäœã£ãŠãã fork ããã ãã§ãã ãWindows ã® CreateProcessã fork ã«çžåœãããã®ããªãïŒæ°èŠããã»ã¹ãäœãïŒ â ãã³ãã«ããæç€ºçã«ç¶æ¿ããããå¿ èŠããã â ããã«ãåããã»ã¹ã«ãã©ã®ãã³ãã«ãããæããå¿ èŠããã â ïŒéåžžã¯ã³ãã³ãã©ã€ã³åŒæ°ã§æž¡ãïŒ// .NET ã§ã®å¿åãã€ãïŒèŠªïŒ using var pipe = new AnonymousPipeServerStream( PipeDirection.Out, HandleInheritability.Inheritable); var psi = new ProcessStartInfo("Child.exe", pipe.GetClientHandleAsString()); // â ãã³ãã«å€ãåŒæ°ã§æž¡ã â var child = Process.Start(psi); using var sw = new StreamWriter(pipe) { AutoFlush = true }; sw.WriteLine("hello"); pipe.DisposeLocalCopyOfClientHandle(); // â ãããå¿ãããšåãçµäºãæ€ç¥ã§ããªã
DisposeLocalCopyOfClientHandle()ã®åŒã³å¿ãã¯
å žåçãªäžå ·åã§ã
åããã»ã¹ãããŸã æžã蟌ã人ãããããšèª€èªããŠåŸ ã¡ç¶ããã
- ã³ãã¯ã·ã§ã³ã¬ã¹åã®éä¿¡
- å®è£ ã«ã€ããŠã¯ãäžèšã®ãUDP.xaml.csããåç §ã®ããšã
- ã³ãã¯ã·ã§ã³åã®éä¿¡
- å®è£ ã«ã€ããŠã¯ãäžèšã®ãTCP.xaml.csããåç §ã®ããšã
è£è¶³ïŒåäžãã·ã³ã§ TCP ã䜿ãéžæïŒ: ãããã»ã¹ééä¿¡ãã®æèã§
TCP ãæããã®ã¯äžèŠé åãã«èŠãããã
çŸåšã¯ãããæåãªéžæè¢ã§ããããã«ãŒããã㯠TCP ã®å©ç¹ã ã»ãåäžãã·ã³ã§ãå¥ãã·ã³ã§ãåãã³ãŒãã§åããâ â åŸãããµãŒãã¹ãå¥ãµãŒãã«ç§»ãã â ã³ã³ããã«åå²ã§ãã ã»OS ãåããªãïŒWindows / Linux / macOSïŒ ã»æ¢åã®ããŒã«ïŒtelnetãcurlãWiresharkïŒã§èª¿æ»ã§ãã ã»HTTP / gRPC ãšãã£ãäžäœãããã³ã«ã䜿ãã ãæ¬ ç¹ã ã»å ±æã¡ã¢ãªã»ãã€ãããé ãïŒãšã¯ããååéãïŒ ã»ããŒãçªå·ã®ç®¡çãèŠãïŒç«¶åããã¡ã€ã¢ãŠã©ãŒã«ïŒUnix ãã¡ã€ã³ ãœã±ããã¯ããã®äžéã§ããã
// .NET 5 以éãWindows ã§ã Unix ãã¡ã€ã³ ãœã±ããã䜿ãã var ep = new UnixDomainSocketEndPoint("/tmp/myapp.sock"); using var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified); socket.Connect(ep);ãUnix ãã¡ã€ã³ ãœã±ããã®äœçœ®ä»ãã ã»TCP ãšåã APIïŒSocketïŒã§æžãã ã»ãããã¯ãŒã¯ ã¹ã¿ãã¯ãéããªãã®ã§ãéãã ã»ãã¡ã€ã« ã·ã¹ãã ã®æš©éã§ãã¢ã¯ã»ã¹å¶åŸ¡ã§ãããâ ã»Windows 10 / Server 2019 以éã§å©çšå¯èœ â åäžãã·ã³éå®ã§è¯ããªããååä»ããã€ãã®ä»£æ¿ã«ãªã
-
DCE/RPC
- DCOM
- .NET Remoting
-
Web ãµãŒãã¹
- XML-RPC
- JSON-RPC
-
WCF (Windows Communication Foundation)
è£è¶³ïŒãã®äžèЧã®çŸæ³ïŒ: æããããŠãããã®ã¯ã
ã»ãŒãã¹ãŠéæšå¥šãŸãã¯çµäºããŠããã
æè¡ çŸæ³ DCOM åããæ°èŠæ¡çšããªãããã¡ã€ã¢ãŠã©ãŒã«è¶ããå°é£ .NET Remoting éæšå¥šã.NET Core 以éååšããªã XML-RPC æŽå²ç JSON-RPC äžéšã§çŸåœ¹ïŒLanguage Server Protocol çïŒâ WCF .NET Core 以éãªãïŒã¯ã©ã€ã¢ã³ãã®ã¿éšå察å¿ïŒCoreWCF ãåãç¿ïŒ çŸåšã®éžæè¢:
ææ®µ åãå Žé¢ HTTP + JSONïŒRESTïŒ æãæ±çšçãã©ãããã§ãåŒã¹ã gRPC ãµãŒãã¹ééä¿¡ãé«éã»åå®å šã»åæ¹åã¹ããªãŒãã³ã° â ã¡ãã»ãŒãž ãã¥ãŒïŒService BusãRabbitMQïŒ éåæã»ççµåãèœã¡ãŠã倱ãããªã SignalR ãµãŒãããã¯ã©ã€ã¢ã³ããžã®ããã·ã¥ ååä»ããã€ã / UDS åäžãã·ã³å ã®é«ééä¿¡ ã.NET Remoting / WCF ããã®ç§»è¡å ã 瀟å ãµãŒãã¹éãæ§èœéèŠ â ãgRPCã Web ãã©ãŠã¶ãããåŒã¶ â RESTïŒ+ OpenAPIïŒ éåæã»ä¿¡é Œæ§éèŠ â ã¡ãã»ãŒãž ãã¥ãŒ æ¢åã® SOAP å¥çŽãæ®ããã â CoreWCF// gRPC 㯠.NET ã§ãã¡ãŒã¹ã ã¯ã©ã¹ã«æ±ãã var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync(new HelloRequest { Name = "world" });gRPC 㯠Unix ãã¡ã€ã³ ãœã±ãããååä»ããã€ãäžã§ãåãããã
**ãåäžãã·ã³ã§ã¯é«éã«ãå¥ãã·ã³ã§ã¯ TCP ã§ã**ãšãã
䜿ãåãã 1 ã€ã® API ã§ã§ããã
è£è¶³ïŒ
WM_COPYDATAã«ãã IPCïŒ: ãŠã£ã³ã㊠ã¡ãã»ãŒãžã
å€å žç㪠IPC ææ®µã§ããããWM_COPYDATAã SendMessage ã§ãä»»æã®ãã€ãåãå¥ããã»ã¹ã«æž¡ããã â OS ãããã»ã¹å¢çãè¶ããŠããŒã¿ãã³ããŒããŠããã ãå¶çŽã ã»åä¿¡åŽã«ããŠã£ã³ããŠãšã¡ãã»ãŒãž ã«ãŒãããèŠã ã»ãåæåŒã³åºããïŒSendMessageïŒãªã®ã§ãçžæãåºãŸããšèªåãåºãŸã â ã»UIPIïŒæŽåæ§ã¬ãã«ïŒã«ããã 管çè æš©éããã»ã¹ â æšæºæš©éããã»ã¹ãžã¯å±ãããéã¯åŒŸããã â ChangeWindowMessageFilterEx ã§æç€ºçã«èš±å¯ãèŠã ã»Session 0 åé¢ã«ããããµãŒãã¹ããã¯å±ããªããæ¢ã«èµ·åããŠããã€ã³ã¹ã¿ã³ã¹ã«åŒæ°ãæž¡ããïŒå€éèµ·åã®ææ¢ïŒ
ãšãã£ãçšéã§ã¯ä»ã䜿ããããã
æ°èŠã«æ±çšã® IPC ãšããŠéžã¶çç±ã¯ãªãã
- UNIX ãã¡ã€ã³ãœã±ãã
- POSIX ã¡ãã»ãŒãžãã¥ãŒ
è£è¶³ïŒ.NET ãã POSIX ã® IPC ã䜿ãïŒ: .NET ã®ã¯ãã¹ãã©ãããã©ãŒã 察å¿
ã«ãããLinux äžã§ .NET ãåããå Žé¢ãå¢ããããè£è¶³ããã
POSIX ã®æ©æ§ .NET ããã®å©çš UNIX ãã¡ã€ã³ ãœã±ãã UnixDomainSocketEndPointïŒæšæºãWindows ã§ãå¯ïŒâPOSIX ã¡ãã»ãŒãž ãã¥ãŒ æšæº API ãªãïŒP/Invoke ããå¥ææ®µïŒ POSIX å ±æã¡ã¢ãª MemoryMappedFileã¯ãã¡ã€ã« ããã¯ã®ã¿ïŒååä»ãã¯äžå¯ïŒã·ã°ãã« PosixSignalRegistrationïŒ.NET 6 以éïŒâãã€ãïŒFIFOïŒ FileStreamã§éãã// .NET 6 以éïŒSIGTERM ãåããŠç¶ºéºã«çµäºããïŒã³ã³ããã§å¿ é ïŒ using var reg = PosixSignalRegistration.Create(PosixSignal.SIGTERM, ctx => { ctx.Cancel = true; // æ¢å®ã®çµäºåŠçãæ¢ãã _shutdown.Cancel(); // èªåã®åŸå§æ«ãè¡ã });ãã³ã³ããéçšã§ã®éèŠæ§ã ã»Kubernetes ã¯åæ¢æã«ãSIGTERMããéã ã»åãåã£ãŠåŠçäžã®ãªã¯ãšã¹ããæãåã£ãŠããçµäºãã â ãããããªããšãåŠçäžã®ãªã¯ãšã¹ããåãããâ ã»ASP.NET Core ã®æ±çšãã¹ãã¯ãæ¢å®ã§å¯Ÿå¿æžã¿ã ïŒIHostApplicationLifetimeïŒ
- Category:ããã»ã¹ééä¿¡
https://ja.wikipedia.org/wiki/Category:%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E9%96%93%E9%80%9A%E4%BF%A1- ããã»ã¹ééä¿¡
https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E9%96%93%E9%80%9A%E4%BF%A1 - å
±æã¡ã¢ãª
https://ja.wikipedia.org/wiki/%E5%85%B1%E6%9C%89%E3%83%A1%E3%83%A2%E3%83%AA - ãã€ã (ã³ã³ãã¥ãŒã¿)
https://ja.wikipedia.org/wiki/%E3%83%91%E3%82%A4%E3%83%97_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF) - UNIXãã¡ã€ã³ãœã±ãã
https://ja.wikipedia.org/wiki/UNIX%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88 - POSIX 1003.1b > Realtime (XSI Option) > _POSIX_MESSAGE_PASSING
https://ja.wikipedia.org/wiki/POSIX_1003.1b
- ããã»ã¹ééä¿¡
- ããã»ã¹ééä¿¡ - UnixClassWiki
https://uc2.h2np.net/index.php/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E9%96%93%E9%80%9A%E4%BF%A1 - ããã»ã¹ééä¿¡ã®æ¯èŒ - ka2yanã®æ¥èš
https://d.hatena.ne.jp/ka2yan/20090327
https://github.com/OpenTouryoProject/SampleProgram/tree/master/Other/InterProcComm
https://github.com/OpenTouryoProject/SampleProgram/tree/master/Other/PipesFamilyHouse
- AnonymousPipeïŒå¿åãã€ãã«ãã芪åããã»ã¹ééä¿¡ïŒ
- StdIOAndPipeïŒæšæºå ¥åºåã«ãã芪åããã»ã¹ééä¿¡ïŒ
è£è¶³ïŒæšæºå ¥åºåã«ãã IPC ã¯ä»ãçŸåœ¹ïŒ:
PipesFamilyHouseã®
StdIOAndPipeïŒæšæºå ¥åºåïŒæ¹åŒã¯ã
çŸåšæããã䜿ããã IPC ã® 1 ã€ã§ããããæšæºå ¥åºå IPC ã䜿ãããŠããäŸã ã»Language Server ProtocolïŒVS Code â èšèªãµãŒãïŒâ ã»Model Context ProtocolïŒMCPïŒ ã»å€ãã® CLI ããŒã«ã®é£æºïŒãã€ãã§ç¹ãïŒ â [èªäœCUIïŒCLIïŒã®è©±](MS_BuildingYourOwnCLI) åç §var psi = new ProcessStartInfo("child.exe") { RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, // â stderr ãå¿ ãèªã â UseShellExecute = false, StandardOutputEncoding = System.Text.Encoding.UTF8, // â æåã³ãŒã };ãå®çªã®èœãšã穎ã â ãstderr ãèªãŸãªããšãããããã¯ããã åã stderr ã«å€§éåºå â ãããã¡ãåãŸã â åãæ¢ãŸã â 芪㯠stdout ãåŸ ã¡ç¶ãã â çžäºã«åæ¢ â â å¿ ãäž¡æ¹ããéåæã§èªããïŒBeginOutputReadLine çïŒ â¡ ãæåã³ãŒãã æ¢å®ã¯ã³ã³ãœãŒã«ã®ã³ãŒãããŒãžïŒæ¥æ¬èªãªã CP932ïŒ â UTF-8 ãæç€ºããïŒ[ã¢ããªã±ãŒã·ã§ã³ã®Unicodeå](MS_ApplicationUnicodeMigration)ïŒ â¢ ãçµäºãåŸ ã€é åºã WaitForExit ã®åã«ãåºåã®èªã¿åããå®äºããã
- ãã€ãïŒ.NETïŒ
https://learn.microsoft.com/ja-jp/dotnet/standard/io/pipe-operations - ã¡ã¢ãª ãããã ãã¡ã€ã«
https://learn.microsoft.com/ja-jp/dotnet/standard/io/memory-mapped-files - .NET ã§ã® gRPC ã®æŠèŠ
https://learn.microsoft.com/ja-jp/aspnet/core/grpc/ - gRPC ã§ã®ããã»ã¹ééä¿¡
https://learn.microsoft.com/ja-jp/aspnet/core/grpc/interprocess
Tags: ç§»è¡, ããã°ã©ãã³ã°, ãã®ä»ãéçºã®è²ã , .NETéçº