2016年2月29日月曜日

Windowsでプロセス間通信5(共有メモリ)

プロセス間通信を共有メモリで行う場合のひな型

 送信側
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;
using System.Runtime.InteropServices;
public class ShareMemWrite
{
  public const string MEMNAME = "TEST";
  
  public static void Main()
  {
    //1.共有メモリの作成
    MemoryMappedFile mem = MemoryMappedFile.CreateOrOpen(MEMNAME,512);
    MemoryMappedViewAccessor acc = mem.CreateViewAccessor();

    DateTime d;
    while(true)
      {
        //2.共有メモリの書き込み
        d = DateTime.Now;
        acc.Write(1,ref d);
        
        Thread.Sleep(1000);
      }
    
  }
  
}

 受信側
using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;
using System.Runtime.InteropServices;

public class ShareMemRead
{
  public const string MEMNAME = "TEST";
  
  public static void Main()
  {
    //1.共有メモリの作成
    MemoryMappedFile mem = MemoryMappedFile.CreateOrOpen(MEMNAME,512);
    MemoryMappedViewAccessor acc = mem.CreateViewAccessor();
    DateTime d;
    while(true)
      {
        //共有メモリの読み込み
        acc.Read(1,out d);
        System.Console.WriteLine(d);
        Thread.Sleep(1000);
      }

  }
  
}

2016年2月20日土曜日

Linuxコマンドでテキスト編集

Linuxコマンドでテキスト編集を書こうと思ったのだけど、
下のページがとってもまとまっていたので、
何か付け足すのがあったら書こう。

Linuxテキスト編集コマンドのすべて

Windowsでプロセス間通信4(メッセージキュー)

プロセス間通信をメッセージキューで行う場合のひな型

 送信側
using System;
using System.Messaging;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;

public class QueueSend
{
  const string QUEUE_NAME = ".\\Private$\\TEST";

  public static void Main(string[] args)
  {
    MessageQueue queue;

    //メッセージキューがある場合はNewする
    //ない場合は、作成する
    if(MessageQueue.Exists(QUEUE_NAME))
       {
         queue = new MessageQueue(QUEUE_NAME);
       }
    else
      {
         queue = MessageQueue.Create(QUEUE_NAME);
      }

    BinaryMessageFormatter bf = new BinaryMessageFormatter();
    Message msg;
    while(true)
      {
        DateTime d = DateTime.Now;
        //メッセージをフォーマットして送信する
        msg = new Message(d,bf);
        queue.Send(msg);
        Thread.Sleep(1000);
        
      }
  }
  
}

 受信側
using System;
using System.Messaging;
using System.Threading;

public class QueueRecv
{
  const string QUEUE_NAME = ".\\Private$\\Test";

  public static void Main(string[] args)
  {
    MessageQueue queue;
    //メッセージキューがある場合はNewする
    //ない場合は、作成する
    if(MessageQueue.Exists(QUEUE_NAME))
      {
        queue = new MessageQueue(QUEUE_NAME);
      }
    else
      {
        queue = MessageQueue.Create(QUEUE_NAME);
      }
    //フォーマッタを指定
    queue.Formatter = new BinaryMessageFormatter();
    Message msg;
    DateTime d;
    while(true)
      {
        //メッセージを受信
        msg = queue.Receive();
        //受信したメッセージを型変換
        d = (DateTime)msg.Body;
        Console.WriteLine(d.ToString());
      }
  }
  
}

2016年2月17日水曜日

Windowsでプロセス間通信3(名前付きパイプ)

プロセス間通信をファイルで行う場合のひな型

 送信側
using System;
using System.IO.Pipes;
using System.Text;
using System.Threading;

public class NamedPipeSend
{
  const string NAME = "test";
    public static void Main(string[] args)
  {

    //1.パイプ作成
    NamedPipeClientStream client = new NamedPipeClientStream(".",NAME,PipeDirection.Out);
    //2.サーバに接続
    client.Connect();
    byte[] sendData = new byte[1024];
    while(true)
      {
        //3.処理
        Thread.Sleep(1000);
        DateTime d = DateTime.Now;
        Encoding enc = Encoding.UTF8;
        sendData = enc.GetBytes(d.ToString());
        client.Write(sendData,0,sendData.Length);
        client.Flush();

      }
  }
}

 受信側
using System;
using System.IO.Pipes;
using System.Text;

public class NamedPipeReceive
{
  const string NAME = "test";

  public static void Main(string[] args)
  {
    //1.パイプ作成
    NamedPipeServerStream server = new NamedPipeServerStream(NAME,PipeDirection.In);
    //2.受信待ち
    server.WaitForConnection();
    byte[] rData = new byte[4096];
    int len;
    while(true)
      {
        rData = new byte[4096];
        //データ受信
        len = server.Read(rData,0,rData.Length);
        if(len == 0)
          {
            break;
          }
        Array.Resize(ref rData,len);
        Encoding enc = Encoding.UTF8;
        System.Console.WriteLine(enc.GetString(rData));

      }
  }
  
}

おまけ(名前付きパイプの一覧表示)
public class NamedPipeList
{
  public static void Main()
  {
    string[] pipeList = System.IO.Directory.GetFiles("\\\\.\\pipe\\");
    foreach(string pipe in pipeList)
      {
        System.Console.WriteLine(pipe);
      }
    
  }
}

2016年2月16日火曜日

Windowsでプロセス間通信2(ソケット(UDP))

プロセス間通信をソケット(UDP)で行う場合のひな型

 送信側
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class SocketSend
{
  const string  address = "127.0.0.1";
  const int port = 5555;
  public static void Main()
  {
    //1.ソケット作成
    Socket soc = new Socket(AddressFamily.InterNetwork,
                            SocketType.Dgram,
                            ProtocolType.Udp);
    IPEndPoint ePoint = new IPEndPoint(IPAddress.Parse(address),port);
    while(true)
      {
        //2.処理
        Thread.Sleep(1000);
        //3.データ送信
        DateTime d = DateTime.Now;
        Encoding enc = Encoding.UTF8;
        byte[] sendData;
        sendData = enc.GetBytes(d.ToString());
        soc.SendTo(sendData,ePoint);
      }
    
  }
  
}

 受信側
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class Socketレエイヴェ
{
  const string  address = "127.0.0.1";
  const int port = 5555;
  public static void Main()
  {
    //1.ソケット作成
    Socket soc = new Socket(AddressFamily.InterNetwork,
                            SocketType.Dgram,
                            ProtocolType.Udp);

    EndPoint ePoint = new IPEndPoint(0,0);
    EndPoint bPoint = new IPEndPoint(0,port);
    byte[] rData = new byte[4096];
    int len;
    //2.ソケットのバインド
    soc.Bind(bPoint);
    while(true)

      {
        //2.データ受信
        len = soc.ReceiveFrom(rData,ref ePoint);
        Array.Resize(ref rData,len);
        Encoding enc = Encoding.UTF8;
        Console.WriteLine(enc.GetString(rData));
        //3.処理
        Thread.Sleep(1000);
        
      }
  }
}

2016年2月14日日曜日

Windowsでプロセス間通信1(ファイル)

プロセス間通信をファイルで行う場合のひな型

 送信側
using System;
using System.IO;
using System.Threading;
public class FileWrite
{
  private static Mutex mut = new Mutex(false,"mut");
  private const string FILE_NAME = "hoge.txt";
  
  public static void Main(string[] args)
  {
 while(true)
   {

  //1.処理
  Thread.Sleep(1000);
  //2.ロック
  mut.WaitOne();
  //3.書き込み
  DateTime d = DateTime.Now;
  StreamWriter sw = new StreamWriter(FILE_NAME);
  sw.WriteLine(d.ToString());
  sw.Close();
  //4.ロックの開放
  mut.ReleaseMutex();
   }
  }
}

 受信側
using System;
using System.IO;
using System.Threading;
public class FileRead
{
  private static Mutex mut = new Mutex(false,"mut");
  private const string FILE_NAME = "hoge.txt";
  
  public static void Main(string[] args)
  {
 while(true)
   {
  //1.ロック
  mut.WaitOne();
  //2.読み込み
  StreamReader sr = new StreamReader(FILE_NAME);
  Console.WriteLine(sr.ReadLine());
  sr.Close();
  //3.ロックの開放
  mut.ReleaseMutex();
  //4.処理
  Thread.Sleep(1000);
   }
  }
}

Windowsでプロセス通信


Windowsでプロセス間の通信を行う時、いくつか方法が
あるけど、比べてみた。

No. 方法 説明 長所 短所
1 ファイル ファイルを作成して共有 分かりやすい HDDディスクを使ってしまう。
2 ソケット通信 TCP or UDP通信を使う プロセスを別のPCに移しても動く オーバスペックな気がする
3 namedpipe 名前付きパイプ
4 メッセージキュー メッセージキュー オブジェクトをそのまま渡せる
5 共有メモリ 共有メモリを作成して書き込み読み込みを行う 可変長データは共有しづらい


2016年2月10日水曜日

linux コマンドでディレクトリ毎の行数確認


├─a
│      chmod.c
│      od.c
│    
└─b
        cut.c
        paste.c

上のような感じでaとbのフォルダにファイルがある時、
aフォルダとbフォルダ毎のファイルの行数を調べたい時の話

1行でできたらおしゃれなのだろうけど、うまくいかなかったので、
shscriptとコマンドを組み合わせて作ってみた。

shscriptの内容は下のような感じ

hoge.sh
#!/bin/bash

for dir in "$@"
do
 echo $dir
        #nameで対象ファイルの絞り込み
 find $dir -type f -name \*.c -o -name \*.h|xargs wc -l|grep 合計
done

うえのシェルスクリプトをパスを通した場所に保存して、find で探したディレクトリを渡す。


find . -type d|xargs hoge.sh

実行結果はこんな感じ。

.
  3907 合計
./a
 2555 合計
./b
 1352 合計
ディレクトリ内にたくさんファイルがあると分割されてしまうけど、
取りえず我慢

2016年2月3日水曜日

c#で動的な関数呼び出し


using System;
using System.Reflection;

public class DynamicCall
{

  public static void TestMethod(int a,int b)
  {
System.Console.WriteLine("a="+a.ToString()+"  b="+b.ToString());
  }

  public  void TestMethod2()
  {
System.Console.WriteLine("test Method2");
  }

  public static void Main()
  {
DynamicCall dCall = new DynamicCall();
//型の取得
Type t = typeof(DynamicCall);
//メソッドの取得
MethodInfo mInfo = t.GetMethod("TestMethod");
//メソッド呼び出しstaticメソッドの場合は、nullでOK
mInfo.Invoke(null,new object[] {10,20});

//メソッドの取得
mInfo = t.GetMethod("TestMethod2");
//メソッド呼び出し通常メソッドの場合は、
//一番目の引数にインスタンス変数を渡す
mInfo.Invoke(dCall,null);

  }

}