投稿

8月, 2019の投稿を表示しています

Linuxシステムコール、共有メモリの使い方

UNIX / Linux システムコール・プログラミング プロセス間通信(IPC)、共有メモリ 共有メモリとは? カーネルが管理するメモリ空間をユーザープロセスに ”見えるようにする” ことで、複数のプロセス間で同じメモリ空間を利用することができます。 プロセスからは通常のメモリと同様に見えるため、同じエリアに対しての同時書き込みなどについては、排他制御を行う、あるいはアトミックな操作とするなどの対応が必要になります。 共有メモリは SYSTEM V IPC です。 それでは、早速サンプルコードについて解説します。 今回のコードは2つのプログラムで構成されています。 shm_r.c 共有メモリは、shmget()システムコールにより共有メモリを取得します。このときの引数の指定で”ない場合は作成する”、パーミッションを与えるなどの指定を行います。生成された共有メモリにアクセスするため、shmat()システムコールでポインタを得るます。 以降、このプロセスはshmat()システムコールで得たポインタを通じ、自由に共有メモリにアクセスすることができます。 この、サンプルshm_r.cは、共有メモリを生成・アタッチすると1秒毎にメモリの更新をチェックし、更新された場合は内容を表示します。このときの更新内容が "Quit"であった場合、共有メモリをデタッチし、共有メモリを破棄します。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <unistd.h> #define DATA_SIZE 2048 int main(void) { int id; char *shmData; char data[DATA_SIZE]; // Shared memory create a new with IPC_CREATE if((id = shmget(IPC_PRIVATE, DA

Linuxシステムコール、シグナルの使い方

UNIX / Linux システムコール・プログラミング プロセス間通信(IPC)、シグナル シグナルとは? プロセスに対して非同期のイベント通知を行います。 プロセス側でシグナルハンドラを定義することで、非同期通知を受けることができます。 Ctrl+C で、動作中のコマンド(プロセス)を停止できますが、Ctrl+C は SIGINT というシグナルを発生させてプロセスの停止を行っています。 また、シグナルは SYSTEM V IPC です。 どのようにシグナルを使うか、下記にサンプルコードを示します。 このサンプルコードでは、 SIGINT と SIGTSTP の2つを受け取るシグナルハンドラを記述しています。 シグナルとシグナルハンドラは、sigaction()システムコールを使って設定されます。 同様のシステムコールとして、signal()が存在しますが、現代ではsigaction()の利用が推奨されています。 また、実装バージョンやアーキテクチャによっても動作や構造体が異なる場合がありますので注意してください。 実行した状態で、Ctrl + c(SIGINT) を押してもメッセージは表示されますがプログラムは停止しません。 Ctrl + z(SIGTSTP) を押すとプログラムが停止するようになっています。 $ ./signal I'm working... ^CCatch SIGNAL[2]    <-- Ctrl + c key in. Work harder!              <-- Signal handler message. Don’t stop. I'm working... I'm working... ^ZCatch SIGNAL[20]   <-- Ctrl + z key in. We have a break.        <-- Signal handler message. It’s goiung stop. I've had enough! $ signal.c #include <stdio.h> #include <stdlib.h> #includ

Linuxシステムコール、メッセージキューの使い方

UNIX / Linux システムコール・プログラミング プロセス間通信(IPC)、メッセージキュー メッセージキューとは? いわゆるメッセージボックスのような動作を行う IPC です。 プロセス間で一意に識別できるメッセージキューに対してメッセージを書き込み、受け取りができます。 また、メッセージキューは SYSTEM V IPC です。 メッセージキューを使うためには、まずメッセージキューを作成してユニークなキューIDを作成する必要があります。msgget()というシステムコールでキューを作成します。 メッセージを送信するためには msgsnd()、メッセージを受信するためには msgrcv()、最後にメッセージキューを削除するために msgctl() を使います。 メッセージの受信側プロセスのサンプルコードを下記に示します。 #include <sys/types.h> #include <stdio.h> #include <sys/ipc.h> #include <sys/msg.h> #include <string.h> #include <unistd.h> #define MSGBUFSIZ 256 int main(int argc, char** argv) { int msqid; key_t msgkey; struct msgbuf{ long mtype; char mdata[MSGBUFSIZ]; }; struct msgbuf msgdata,*p; p = &msgdata; // Make Message queue key. msgkey = ftok("msgq.key",'X'); // Get Message queue ID. msqid = msgget(msgkey,IPC_CREAT|0666); // Message receive loop wile get "Quit" massage. while(1) { // Receive a Message.

IPC(Inter Process Communication) とは?

イメージ
IPCの基本: Linuxだけではなく、マルチタスクをサポートしたOSでは各タスク(=プロセス)が強調動作できるようにタスク間通信をサポートしています。  特に、仮想メモリをサポートし、カーネル空間とユーザー空間をプロテクション機構によって分断されたメモリ空間でユーザープロセスが動作するようなシステムでは、ユーザープロセス同士で直接データをやり取りすることができません。  また、FreeRTOSのように仮想アドレスでの動作では無いものの、複数スレッドの動作が可能となるような環境下では通信の確実性、つまり通信の途中でスケジューリングされてデータ転送が不完全な状態になる、といった事象をさけるためにもOSがタスク間通信をサポートしています。 Uinuxでは、Inter Process Communication = IPC としてサポートしています。  基本となるIPC関連のシステムコールには下記のものがあります。   ・メッセージキュー   ・共有メモリ   ・パイプ   ・ソケット   ・シグナル   ・セマフォ このうち、メッセージキュー、セマフォ、共有メモリは歴史的に SYSTEM V IPC と呼ばれ、ファイルシステムを利用しないIPCとなっています。 以下、それぞれの特徴について簡単に記述します。  メッセージキュー: いわゆるメッセージボックスのような動作を行う IPC です。 プロセス間で一意に識別できるメッセージキューに対してメッセージを書き込み、受け取りができます。  共有メモリ: カーネルが管理するメモリ空間をユーザープロセスに ”見えるようにする” ことで、複数のプロセス間で同じメモリ空間を利用することができます。 プロセスからは通常のメモリと同様に見えるため、同じエリアに対しての同時書き込みなどについては、排他制御を行う、あるいはアトミックな操作とするなどの対応が必要になります。 パイプ: コマンドのリダイレクションで使われるパイプです。 先のコマンドの標準出力を次のコマンドの標準入力にパイプでつなぐことでプロセス間の通信を行っています。 ソケット: インターネットの基礎ともいえる通信です。 ソケットは同じノード(CPU)内でのプロセス間通信だけではなく、ノード間の

BeagleBone Black 起動SDカードの作成

イメージ
BeagleBoen Blackとは? BeagleBone Black(以下BBBとします)は、TIとDigi-Keyの協力で開発されたBeagleシリーズの1つで、TIで開発しているARMプロセッサのAM3xxx系のCPUを搭載しています。 また、この記事もDigi-Keyの記事をベースに記述しています。 https://www.digikey.com/eewiki/display/linuxonarm/BeagleBone+Black Wikipedia Beagle Board より BeagleBoneは、オープンソースの理念に基づき設計されているため回路図が公開されています。よくBeagleBoneと比較されるRaspberryPiですが、こちらは最近ではI/Oなどの周辺部分を除き公式には公開されていません。また、Video周りなどのドライバに関してもバイナリ提供でソースコードは公開されていません。  BeagleBone の回路図は、GitHub にアップされています。   https://github.com/beagleboard/beaglebone-black/blob/master/BBB_SCH.pdf BeagleBone Black はボード上に512MBのRAM、4MBのMMC、SD-Cardスロット、USB、LAN、HDMIなどが搭載されていて、購入状態で MMC 上の Linux が起動できます。 今回の企画では、SDカード上にLinuxを構成して、BBB を起動するまでについて解説します。なお、起動時の RootFS は、Debian を使用します。 また、下記の説明では "sudo" の表記を省略していますので、適宜 "sudo" を使ってコマンドを実行するようにしてください。 追記:  ↓ネットワーク・ブートしたい場合  Beaglebone Black ネットワーク・ブート環境の構築 用意するもの: ・BeagleBone Black  ・開発用Linux PC(仮想PCでもOK)  ・3.3vUSBシリアル変換ケーブル    http://akizukidenshi.com/catalog/g/gM-0