1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Goでテキストファイルを使用したIPC(プロセス間通信)をやってみた

Last updated at Posted at 2020-12-13

テキストファイルを用いたIPC

異なるプロセス(ソフト)間でデータの共有・連携をする際にIPC(プロセス間通信)を使用する。 GoでIPCをやろうと思ってみたら、なかなか簡単な方法が見つからなかったので ファイルの読み書きを使用したシンプルなIPCを実験してみた。

テキストファイルIPCのメリット

仕組みがシンプル(テキストファイルの読み取り、書き出しだけで出来る) 全く異なる言語で作成したソフト間でも確実にデータ連携が可能。

実験内容

ソフトウェア上で入力した文字列を、もう一方のソフトで表示させる。 C#(WPF)で文字列を入力・送信するソフトを作成し、送信すると入力文字列がテキストファイルに書き込まれる。 Goで入力された文字列をPrintするCLIを作成する。テキストファイルを読み取り、中身が変わったらCLI上にPrintする。 WPFには最終更新日時を表示させておく。Goが文字列をPrintしたら、テキストファイルにその際の日時を書きだす。 文字列・更新日時の読み取り間隔は5秒間 C:\Users\Public\DocumentにData.txt(文字列連携用テキスト)とLastUpdate.txt(更新日時連携用テキスト)を入れて使う。 ![IPCイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/db536e30-a5de-eccd-dbfe-be53dc1c8c5d.png)

動作環境

OS:Windows 10 WPFアプリケーション:.Net Core 3.1 (C#で作成) GO:version 1.15.5

テキストファイルIPCのソースコード

```Go package main

import (
"time"
"fmt"
"io/ioutil"
)

func Receive(ch1 chan string){
for{
data, _:=ioutil.ReadFile("C:\Users\Public\Documents\Data.txt")
ch1<-string(data)
time.Sleep(5*time.Second)
}
}

func Date(ch2 chan string){
for{
now:=time.Now().Format("2006-01-02 15:04:05")
ch2<-now
time.Sleep(5*time.Second)
}
}

func main(){
ch1:=make(chan string)
ch2:=make(chan string)
go Receive(ch1)
go Date(ch2)
var prevdata string=""
for{
msg1:=<-ch1
msg2:=<-ch2
if prevdata != msg1{
fmt.Println(msg1)
_=ioutil.WriteFile("C:\Users\Public\Documents\LastUpdate.txt",[]byte(msg2),0644)
prevdata = msg1
}
}
}

io/ioutilを使用してテキストファイルの読み取り/書き出しを実行。
Receiverゴルーチンでテキストファイルを読み取り、ch1に読み取った値を入れてます。
Dateゴルーチンで日時を取得し、ch2を経由してテキストファイルに書き出します。
(並列処理ではなく)2つのプロセスをわかりやすく分けるため、今回はゴルーチンにしました。
time.Sleepで5秒間隔に読み取り・書き出しを行っています。
更新がない場合にPrintしないよう、prevdata変数を判定に使用してます。

![Tx_main.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/e76a719c-bcb9-ec03-db92-52eb64c44a5f.png)
WPFアプリケーションはこのような感じ。
GoのCLIと異なるのはTextBoxがあるくらいで、処理はほとんど同じ。

<h1>結果</h1>
![Rx_main.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/1bce6201-6a55-3e80-2365-153f9f548cf4.png)
「吾輩は猫である」と表示されてるときに「名前はまだない」と入力したら
![IPC.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595683/25f55b88-a47b-ff81-aedd-9d4d05bef793.png)
Go側にちゃんと「名前はまだない」が表示された。

<h1>最後に</h1>
WPFとGolangでデータ連携が出来たということは、デスクトップ上のクライアントからWebアプリに容易にデータ送信できるかもしれない。
全く異なるプログラミング言語やプラットフォーム同士の連携も、テキストファイルなら簡単に出来るのかも。

<h1>引用・参考文献</h1>
https://www.udemy.com/share/101XCSAEMZdFZXTHQG/
ゴルーチンとioutilの使用方法は、酒井潤先生のこちらのUdemy講座を参考にしました。

https://icooon-mono.com/ (WPFアプリアイコン)
https://www.silhouette-illust.com/ (テキストファイル・CLIアイコン)
イラストにアイコンを使用させていただきました。

https://qiita.com/navel3/items/cec4a8875faa8644d8db
navel3さん記事 ソケットを利用したIPCパッケージを作成しています。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?