C/C+
やりたいこと 自分は端末Aでログインしている状態。 端末Aから別の端末である端末Bのコマンドの入力、応答をのぞき見たい。 できればC言語で実装したい 実現方法 ググってみたところ、perl製のttylogを使ったり、shellスクリプトで頑張ればできるようです。 …
Linuxのpacketソケットを使って受信フレームの内容を表示してみます。 今回はEther + IPv4 + TCPで受信したフレームの各ヘッダ情報を表示するアプリケーションを作ります。Linux, C言語です。 packetソケットについての詳しい説明はMan page of PACKETとかを…
C/C++のプログラマーなら一度は悩ませられるであろうメモリ関連のバグ。その内の1つであるメモリ破壊は作りこむのは簡単ですが、後々見つける事が難しくなる場合も多くやっかいな奴です。 今回はそんなメモリ破壊検出の助けとなるツールをいくつか試してみ…
プライベートMIBで監視するためのサブエージェントをNet-SNMPをベースに作成してみた。 作成&実行環境はLinux-CentOS7(64bit)、言語はC。 はじめに Net-SNMPのインストール ソースコードのダウンロード configure / make / make install コンフィグ(snmpd.c…
LinuxでNETLINKを使ったネットワークインタフェースの状態変化(up/down, IPアドレスの追加/削除)を検知してみる。NETLINKはネットワークインタフェースの状態変化をカーネルからユーザランドのアプリケーションに対してソケットインタフェース経由で通知して…
前回に引き続きラズパイ用の開発環境を構築し実機でHello Worldを表示(シリアル経由)するまでをやってみる。 実機は初期モデルからメモリが2倍の512MBになったVer。 最近のラズパイに比べたら装備も性能も劣るけれど個人的にはこっちのシンプルな方が好き。 …
gdbでデバッグ時に、対象のプログラムが内部で持っている絶対秒(Unix時間)を 日付に変換して表示する方法。バグ等でcoreファイルから原因を調査する際に欲しくなったので作ってみた。 具体的には~/.gdbinitにユーザ定義のコマンドを作って実現する。#普通にg…
最も簡単な暗号化/複合化を試してみる。 任意のデータとある定数値の排他的論理和(XOR)を2回とると元のデータに戻る性質を利用する。例) 任意のデータ : 10101010 XORをとる定数: 11110000 1回目 10101010 XOR 11110000 ------------- 01011010 2回目 010110…
socatを使ってUNIXドメイン通信を中継し通信内容をのぞいてみる。 構成のイメージは下記。 -------------------------------------------------- ________ ________ ________ | | | | | | | Client |--->| socat |--->| Sever | |________| |________| |____…
Ncurses(*1)を使ってスクリーン制御してみる。(*1) CUIでスクリーン、キー入力、カーソルなどの制御機能を提供するライブラリのこと。 make menuconfig とか実行すると出てくるアレを実現できる。 ソースコード sample.c #include <curses.h> #include <stdlib.h> #define ESCAPE</stdlib.h></curses.h>…
TCPを使ってWindowsとLinux間で通信してみる。 具体的にはWindows上にVirtualboxで仮想マシンを作成しHost-Only-Adapter経由で通信する。 構成 サーバ : Linux CentOS 6, X86_64(64bit) on Virtualbox クライアント : Windows7 (32bit) プログラム作成 クラ…
Qt5を使ってGUIプログラミングに挑戦してみる。 まずはウィンドウを出すだけ。Linuxサーバでアプリケーションを作成&実行し、表示はWindowsで行うスタイル。 実行環境 ホスト側 Windows7 32bit Xming 6.9.0.31 Teraterm 4.9.2 サーバ側(実行側) CentOS 6, x…
Linuxのsignalfdを使ってシグナルをepollで監視する。 signalfd.c #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/epoll.h> #include <sys/signalfd.h> #include <errno.h> #define MAX_EVENTS 10 #define RET_OK (0) #define RET_NG (-1) #d…</errno.h></sys/signalfd.h></sys/epoll.h></sys/socket.h></unistd.h></string.h></signal.h></stdlib.h></stdio.h>
TAILQを使ってリストを実現する。 詳細はMan page of QUEUE参照。 tail.c #include <stdio.h> #include <stdlib.h> #include <sys/queue.h> typedef struct memEntry { TAILQ_ENTRY(memEntry) entry; int32_t size; void* ptr; } memEntry_t; typedef struct { TAILQ_HEAD(tq_head, memEntry)</sys/queue.h></stdlib.h></stdio.h>…
LinuxでUDPによる通信を行うサンプルプログラム。この手の例はGoogle先生で検索すれば沢山でてくるけど、システムコールのリターン値を見てなかったり、openに対応するcloseをしていない例が多いことに気付くと思う。もちろん動かすことだけ考えたら気にする…
使い方をすぐに忘れるsigactionでシグナルを捕捉する方法。 #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <signal.h> #include <errno.h> #include <string.h> #include <unistd.h> static volatile sig_atomic_t RecvSigno = 0; void signal_handler(int signo) { RecvSigno = signo; } int main(void) </unistd.h></string.h></errno.h></signal.h></stdint.h></stdlib.h></stdio.h>…
いまどきX11でプログラム書くことがあるかは知らないけど、 凄い昔にLinuxでGUIのプログラミングにトライしたときのサンプルコードを見つけたので掲載。 現代はQtとか使うのかな。事前準備 $ sudo yum -y install libX11* x11.c #include <X11/Xlib.h> #include <X11/Xutil.h> #includ</x11/xutil.h></x11/xlib.h>…
実用性はゼロですが、お遊び感覚でCとperlでやってみた。Perlの場合quine.pl $_=q{ q[ * * * * * * * * * * * * * * Hello Quine * * * * * * * * * * ]; print"\$_=q{$_};eval\n"};eval 実行結果 $ perl quine.pl $_=q{ q[ * * * * * * * * * * * * * * Hel…
シンプルなprintf()デバッグをコンパイルスイッチでON/OFFできるように実装する。trace.c #include <stdio.h> #ifdef DEBUG_ENABLE #define ENTRANCE(fmt, ...) \ printf("%s:%u:===> IN %s(" fmt ")\n", __FILE__, __LINE__, __func__, ##__VA_ARGS__); #else #defin</stdio.h>…
GNUのプロファイラ gprofでコードの処理速度計測を試してみた。 関数単位、LINE(行)単位での実行速度の計測ができる模様。今回は関数単位でお試し。使い方は"-pg"のオプションを付与してコンパイルしたバイナリを実行後にgprofコマンドをかませばOK。gprofte…
LinuxでWindowsのkbhit()相当を実装する。kbhit.h #ifndef _KBHIT_H_ #define _KBHIT_H_ #include <stdbool.h> #include <termios.h> #include <unistd.h> extern void KB_open(void); extern void KB_close(void); extern bool kbhit(void); extern char linux_getch(void); #endif /* _KBHI</unistd.h></termios.h></stdbool.h>…
お呼びでない関数を実行する。overrun.c #include <stdio.h> #include <stdlib.h> void goast(void) { printf("Boo!\n"); } void dummy(void) { char a[1] = {0}; a[9] = &goast; } int main(void) { dummy(); return 0; } 実行例 $ gcc overrun.c overrun.c: In function 'dumm</stdlib.h></stdio.h>…
Linuxでerrno一覧 #include <stdio.h> #include <string.h> #include <errno.h> int main(void) { for(int i = 0; i <= EHWPOISON; i++) { char str[64] = {0}; strerror_r(i, str, sizeof(str)); printf("%d:%s\n", i, str); } return 0; } 実行結果 0:Success 1:Operation not permitte</errno.h></string.h></stdio.h>…
Linux Kernelのリスト構造を参考に作成。環境:CentOS 6, gcc version 4.4.7mempool.h #ifndef _MEMPOOL_H_ #define _MEMPOOL_H_ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdint.h> #include <stddef.h> #define EASY_ELECTORIC_FENCE (0x123456789) #define list_for</stddef.h></stdint.h></unistd.h></string.h></stdlib.h></stdio.h>…