モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

メモリ操作に関するシステムコールのサンプルコード (C 言語)

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2018/08/20
最終更新最終更新
2020/12/24
記事区分記事区分
一般公開

目次

    アカウント プロフィール画像 (サイドバー)

    日常業務に役立てるためのシンプルなスニペットを公開しています。

    0
    ステッカーを贈るとは?

    メモリ操作に関するシステムコールを利用した C 言語のサンプルコードを記載します。

    ページサイズの確認 (getpagesize)

    OS はメモリを複数のページに分割して管理しています。一つのページのサイズは以下のコマンドで確認できます。通常は 4kb です。

    $ getconf PAGESIZE
    4096
    

    システムコール getpagesize を利用して上記値を取得できます。

    #include <unistd.h>
    #include <stdio.h>
    
    int main() {
        printf("%d\n", getpagesize());
        return 0;
    }
    

    バッファ用の変数を利用せずにファイルディスクリプタからデータを読み出す (mmap/munmap)

    open 等で用意したファイルディスクリプタ経由でデータを読み出して、バッファ用の変数にコピーするためには read を利用できます。そうではなく、ファイル自体をメモリに貼り付けることでデータを読み出すこともできます。メモリ内に別途バッファ用の変数を用意する必要もありません。ただし、read と比較して I/O の発生タイミングについては制御が困難です。

    #include <sys/mman.h>
    #include <unistd.h>
    #include <stdio.h>
    
    int main() {
        int fd_r = 0; // 標準入力をメモリに貼り付けてみます。
        int fd_w = 1; // 標準出力
    
        int pagesize; // ページサイズ
        int filesize; // 標準入力のファイルサイズ
        int p; // ファイルポインタ
        char *mp; // メモリに貼り付けられたファイルへのポインタ
    
        // ページサイズの取得
        pagesize = getpagesize();
    
        // ファイルサイズの取得 (ファイル終端まで進めてファイル先頭からのオフセットを取得)
        if((filesize = lseek(fd_r, 0, SEEK_END)) < 0) {
            perror("lseek failed");
            return 1;
        }
    
        // ここでは、標準入力の一部だけをメモリに貼り付けてループする実装とします。
        for(p = 0; p < filesize; p += pagesize) {
            if(filesize < p + pagesize) {
                pagesize = filesize - p; // ループの最後のみ微調整
            }
            // 読み込み専用でメモリに貼り付けます。
            if((mp = mmap(0, pagesize, PROT_READ, MAP_PRIVATE, fd_r, p)) == MAP_FAILED) {
                perror("mmap failed");
                return 1;
            }
            write(fd_w, mp, pagesize);
            if(munmap(mp, pagesize) < 0) { // メモリを解放します。
                perror("munmap failed");
                return 1;
            }
        }
        return 0;
    }
    

    実行例 (echo コマンドをコピーしています)

    $ gcc -Wall -O2 main.c && ./a.out < /bin/echo > myecho
    $ md5sum /bin/echo
    40c0d2f7bd3e35325bc04b332987272a  /bin/echo
    $ md5sum myecho 
    40c0d2f7bd3e35325bc04b332987272a  myecho
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    日常業務に役立てるためのシンプルなスニペットを公開しています。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事

      • cmake で ccache を有効化するための設定
        YOCTO Linux で開発している場合など、ビルド速度が開発効率にそのまま影響する際は ccache (compiler cache) で C/C++ ビルドを高速化することを考えます。cmakeと併用する場合の設定およびコマンド例を記載します。 インストール sudo apt install ccache 以下のバイナリファイルに加えて $ w
        AWS NinjaAWS Ninja11/22/2022に更新
        いいねアイコン画像0
      • Python から C ライブラリを利用 (ctypes)
        FFI (Foreign Function Interface) の一つである ctypes を利用すると、C 言語のライブラリを Python から利用できます。サンプルコードを記載します。 適宜参照するための公式ドキュメント libm の sqrt を利用する例 main.py ``
        coderinacoderina9/2/2021に更新
        いいねアイコン画像0
      • 低レイヤーネットワークプログラミングに関する雑多な知識
        TCP/IP モデルのうちトランスポート層ではなく、インターネット層およびネットワークインターフェイス層のパケット (正確には PDU) を扱う低レイヤープログラミングの雑多なテクニックをまとめます。『ルーター自作でわかるパケットの流れ』などを参考にしています。バックアップ目的で書籍のサンプルコードをホスティングしました。 検証環境
      • ファイルディスクリプタ関連のシステムコールのサンプルコード (C 言語)
        ファイル記述子 (File Descriptor) に関連するシステムコールを利用した C 言語のサンプルコードを記載します。 ファイルの読み書き open/close main.c #include <unistd.h> #include <fcntl.h> #include <stdio.h> int main() { int fd_r, fd_w;...
        フロックフロック10/7/2021に更新
        いいねアイコン画像0
      • C言語の資産を利用 (C++をもう一度)
        サンプルコード メルセンヌ・ツイスタなど、C言語で記述されたライブラリをC++から利用するためには extern "C" を利用します。その際、組み込みマクロ __cplusplus を利用するとC言語からもC++からも利用できるヘッダファイルを作成できます。 sub.h #ifndef SUB_H_ #define SUB_H_ #ifdef __cplu