lessコマンドを"tail -f"として使う方法

September 21,2017 1:55 AM
Category:[Linux]
Tag:[Linux]
Permalink

lessコマンドを"tail -f"として使う方法を紹介します。

1.はじめに

tailは名前のとおり、ファイルの最後の10行を表示するコマンドです。

このコマンドに"-f"オプションをつけることで、表示したファイルが更新されて末尾行が追加されると、追加された行も表示されます。

% tail -f ファイル名

このためtailコマンドはログの監視によく使われます。

ただこのtailコマンドでファイルの前方に戻る場合、tailをCtrl-cで一旦終了させ、TeraTermなどのターミナルをスクロールし、ログ監視を再開する場合はtailコマンドを入力し直すという、ちょっと操作が面倒です。

ということで、lessコマンドを"tail -f"として使う方法を紹介します。

2.lessコマンドを"tail -f"として使う方法

lessコマンドを"tail -f"として使うには、"+F"オプションを利用します。

% less +F ファイル名

"+F"は、前方にスクロールし、ファイルの終端に達しても読み続けるオプションです。

つまりこのオプションで"tail -f"と同じように動作します。

この状態でCtrl+Cを入力すると、通常のless状態に戻ります。

通常のless状態からShift+fを入力すれば、再び監視状態になってくれ、コマンドを終了させる手間がなくなります。

Comments [0] | Trackbacks [0]

C++で#ifdef/#if defined/#elseを利用する方法

September 14,2017 12:03 AM
Category:[C/C++]
Tag:[C/C++]
Permalink

C++で#ifdef/#if defined/#elseを利用する方法を紹介します。

1.問題点

下記のサンプルコードがあります。

test.cpp

#include <stdio.h>
 
int main(void) {
#ifdef TEST
    printf("test\n");
#else
    printf("no test\n");
#endif
    return 0;
}

ビルドと実行で、

% g++ test.cpp
% ./a.out
no test

となります。

このコードで、

    printf("test\n");

の行を通過させたいのですが、方法がわかりません。

ということで、C++で#ifdef/#if defined/#elseを利用する方法を紹介します。

ちなみに"#ifdef"の部分は、下記のように"#if defined()"に置き換えることもできます。

#include <stdio.h>
 
int main(void) {
#if defined(TEST)
    printf("test\n");
#else
    printf("no test\n");
#endif
    return 0;
}

2.#ifdef/#if defined/#elseを利用する

#ifdef/#if defined/#elseを利用するには、gccに"-D"オプションを適用します。

"-D"はプリプロセッサオプション(コンパイルする前に、Cプリプロセッサにかけられる)で、フォーマットは、

-Dmacro

または、

-Dmacro=defn

のいずれかになります。

これは"-D"の後方にあるmacro(マクロ)の有効・無効を指定するもので、有効であれば、"#ifdef/#if defined()"で括られた部分がコンパイル対象になり、そうでなければ"#else"で括られた部分がコンパイル対象になります(#elseがなければコンパイル対象なし)。

上記のサンプルであれば、マクロが"TEST"なので、

% g++ -DTEST test.cpp

としてビルド・実行すれば、マクロ"TEST"が有効となるので、

    printf("test\n");

がコンパイル対象となり、結果、この行を通過します。

% g++ test.cpp

としてビルド・実行すれば、マクロ"TEST"は無効なので、

    printf("no test\n");

がコンパイル対象となり、結果、この行を通過します。

Comments [0] | Trackbacks [0]

nmコマンドでシンボルのサイズを調べる方法

September 1,2017 12:03 AM
Category:[Linux]
Tag:[Linux]
Permalink

nmコマンドでシンボルのサイズを調べる方法を紹介します。

1.問題点

次のサンプルプログラムを作りました。目的は配列変数a,b,cのサイズ取得です。

test.cc

int main() {
    static int a[1000];
    static int b[10000];
    static int c[100];
    return 0;
}

ビルドして実行ファイルa.outを作成します。

% g++ test.cc
% ls -l
合計 16
-rwxr-xr-x 1 root root 8561  8月 31 00:18 a.out
-rw-r--r-- 1 root root  102  8月 31 00:19 test.cc

nmコマンドで実行ファイル指定すると、次のように表示されます。"--demangle"はシンボルをデマングルするためのオプションですが、今回の問題を解決するための本質ではないので説明は省略します。

% nm --demangle a.out
0000000000600df8 d _DYNAMIC
0000000000601000 d _GLOBAL_OFFSET_TABLE_
0000000000400640 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 w _Jv_RegisterClasses
000000000060ae40 b main::a
0000000000601200 b main::b
0000000000601060 b main::c
0000000000400778 r __FRAME_END__
0000000000600df0 d __JCR_END__
0000000000600df0 d __JCR_LIST__
0000000000601030 D __TMC_END__
000000000060102c B __bss_start
0000000000601028 D __data_start
0000000000400560 t __do_global_dtors_aux
0000000000600de8 t __do_global_dtors_aux_fini_array_entry
0000000000400648 R __dso_handle
0000000000600de0 t __frame_dummy_init_array_entry
                 w __gmon_start__
0000000000600de8 t __init_array_end
0000000000600de0 t __init_array_start
0000000000400630 T __libc_csu_fini
00000000004005c0 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
000000000060102c D _edata
000000000060bde0 B _end
0000000000400634 T _fini
0000000000400468 T _init
00000000004004c0 T _start
0000000000601040 b completed.6337
0000000000601028 W data_start
00000000004004f0 t deregister_tm_clones
0000000000400580 t frame_dummy
00000000004005b0 T main
0000000000400520 t register_tm_clones

サンプルプログラムの中にある各データは、

000000000060ae40 b main::a
0000000000601200 b main::b
0000000000601060 b main::c

で、それぞれのサイズを知るには、次のシンボル開始アドレスから自分の開始アドレスを引けばいいはずです。

が、より簡単に調べたい方法が分かりません。

ということで、nmコマンドでシンボルのサイズを調べる方法を紹介します。

2.シンボルのサイズを調べる

シンボルのサイズを調べるには、"--size-sort"オプションを利用します。

% nm --demangle --size-sort a.out
0000000000000001 b completed.6337
0000000000000002 T __libc_csu_fini
0000000000000004 R _IO_stdin_used
000000000000000b T main
0000000000000065 T __libc_csu_init
0000000000000190 b main::c
0000000000000fa0 b main::a
0000000000009c40 b main::b

"--size-sort"はシンボルをサイズの順にソートするオプションです。

表示されている値はシンボルの値ではなくサイズで、シンボルの値を次に現われる シンボルの値から引いたものです。

これで配列変数a,b,cのサイズがそれぞれ"fa0","9c40","190"であることが分かります。

さらに"--reverse-sort"オプションを付与すると、サイズの大きい順にソートしてくれます。

% nm --demangle --size-sort --reverse-sort a.out
0000000000009c40 b main::b
0000000000000fa0 b main::a
0000000000000190 b main::c
0000000000000065 T __libc_csu_init
000000000000000b T main
0000000000000004 R _IO_stdin_used
0000000000000002 T __libc_csu_fini
0000000000000001 b completed.6337

これで配列変数a,b,cのサイズが、b>a>cであることが一発でわかります。

Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages