Ubuntuの端末でシステムコールの数え方と種類の数え方を学ぼう!

このQ&Aのポイント
  • Ubuntuの端末でcとJavaのコードを実行し、straceコマンドでシステムコールを読み取る方法について調べています。
  • tracefileに出力されたシステムコールの行数を数え、さらにシステムコールの種類の数を数える方法を知りたいです。
  • 便利なコマンドや使い方があれば教えてください。
回答を見る
  • ベストアンサー

Ubuntuの端末におけるシステムコールの数え方

こんばんは。 課題でcとJavaのコードを実行してstraceコマンドでその実行時のシステムコールを読み取るという課題をやっています。 Ubuntuの端末でcとJavaのコードをコンパイルし、straceコマンドを実行するとtracefileというのがでてきてそこにずらずらシステムコール(おそらく)が書いてあります。 ↓ こんな感じ。 3232 execve("./Noop", ["./Noop"], [/* 39 vars */]) = 0 3232 brk(0) = 0x98c6000 まずこれがシステムコールであっていますか?execveとかがそうですか? これが6000行くらいあります。 質問はこの中からresumedと書かれたラインを抜かした行数を数え(システムコールの数を数える)、さらにシステムコールの種類の数を数えたいのですがいい方法はありますでしょうか? 便利なコマンドとかあったら使い方とともに教えていただきたいです。 もし何か検討違いなことを言っていたら教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • astronaut
  • ベストアンサー率58% (303/516)
回答No.2

正規表現の問題ですね 最初の ( 以降を取り除くってことでよければ sed 's/\([^(]*\)(.*/\1/' かな。 後方参照を使って、行全体を最初の ( の直前までで置き換えてます。 #もっとシンプルな表現もありそうですが・・・ (参考)http://www.kt.rim.or.jp/~kbk/regex/regex.html

KaYoukAyOu
質問者

お礼

おぉ、できました!(以降が全部消えました。 そしたら最初の4ケタの数字も微妙に違っていることに気付いて \{n\}を使ったら最初の4ケタの数字も消せシステムコールだけでまとめることができました。 あとはuniqとsortとwc使ったらできた、と思います。 とても助かりました。 ありがとうございました。

その他の回答 (1)

  • astronaut
  • ベストアンサー率58% (303/516)
回答No.1

課題ですよね sedとかawkとかgrepとかperlとかsortとかuniqとかwcとか、色々組み合わせて「いい方法」を見つけるのが醍醐味なので、楽しんで取り組んでください。 > もし何か検討違いなことを言っていたら教えてください。 s/検討違い/見当違い/

KaYoukAyOu
質問者

補足

漢字間違い、お恥ずかしい。 先生もsedとuniqが使えるといっていたのでその二つでがんばっているのですが、 3232 execve("./Noop", ["./Noop"], [/* 39 vars */]) = 0 の( 以降を何かに置換してuniqでまとめようとしています。 sed 's/([^(]*$/ XXX/'とし( 以降をXXXで置換しようとしたのですがこれだと( が二回出てくると最後の( 以降しか置換してくれません。 最初の( から末尾までを置換する方法はありますか? or もっとスマートな方法がありますか? よろしくお願いします。

関連するQ&A

  • システムコールについて

    最近システムコールについて学んでいるのですが、C言語でprintfを実行するために必要なシステムコールを特定するにはどのようなさぎょうをすればよいでしょうか? はじめに適当なプログラムを作ってあるのですが、そのプログラムを工夫することによって特定するやり方でお願いします。

  • システムコールについて。

    アセンブリ言語で、int $0x80はシステムコールと言われていますが、Linuxを知らないとわかりません。システムコールはアプリとカーネルのインターフェースです。 x86 Linux 32bitのシステムコールの呼び出しは int 0x80です。 システムコールはEAXに格納されている数値でいろいろな処理ができます。 https://www.mztn.org/lxasm64/x86_x64_table.html を見ていただくとWRITEのsyscall#は4です。 mov $0x4,%eax でeaxに4を入れているので画面に出力したいのだとわかります。 WRITEの第2引数は画面に出力したい文字列が格納されているアドレスでECXに格納します。 mov %esp,%ecx とスタックポインターのアドレスをecxに入れています。 ESPは push eax でEAXに格納されている$0x616b6157(Waka)がスタックに退避しています。 WRITEの第3引数は文字数です。文字数はEDXに格納します。 mov $0x4,%edx と4が入っているので文字数は4です。 このプログラムを実行させると画面にWakaと表示して元の画面に戻ります。そのためのRETです。 C言語で書けばたった1行。 write(1,"Waka",4) これについて詳しく教えていただけないでしょうか?すみません。

  • フォートランソースから端末コマンドを実行する方法

    fortran のソースプログラムからOSのコマンドを起動する場合、以下の様にやるようです。 call system("dir") <-windowsでの例 これをソースプログラムに記入し、コンパイルして実行すると、この部分に処理が来たら、実行ファイルが置いてあるフォルダのファイル名が画面上に表示されます。 この場合、call system(" ")のコーテーションマーク内部はOSの端末からキーボード入力するコマンドは何でもOKなのでしょうか。限界はないのでしょうか。mkdirは利きましたが、cdは利きませんでした。実行中にいったんフォルダを変更することはできないのでしょうか。 また、call system() の中のコーテーションはシングル・ダブルのどちらが正しいでしょうか。どちらも動作するようではありますが。 よろしくお願いします。

  • linuxにシステムコールの追加

    linuxに新しくシステムコールを追加したいのですが、 http://xathrya.web.id/blog/2012/10/16/add-new-system-call-to-linux-3-6-1/ こちらのサイトを参考にしているのですが、makeを実行すると arch/x86/built-in.o:(.rodata+0x14a0): undefined reference to `sys_mycal' make: *** [vmlinux] Error 1 と、エラーになってしまいます。 どうしたらよいのでしょうか。 OSのバージョンはUbuntu 12.0.4(VMWareで実行、ホストはWin7) カーネルのソースは3.6.1です。 よろしくお願いします。

  • SYSTEM関数等を用いて複数のコマンドを打ち込みたい

    こんばんは。C言語初心者のjovanといいます。 初心者のため拙い文章になってしまう可能性があることを初めにお詫びしておきます。 現在SYSTEM関数を使って、コマンドプロンプトでコマンドを実行するプログラムを作成しているのですが、少々困ったことになりました。 というのも、 SYSTEM("cl c:\\temp.c"); などと打ち込むと、ダブルクォーテーション内の記述がコマンドプロンプト上で実行され、コマンドプロンプトが終了されますよね? 私がやりたいのはそれだけではなく、(1)コンパイラをロードし、(2)フォルダを移動し、(3)コンパイルというような動作をコマンドプロンプト上で行わせたいのです。 しかしながら、この3つの動作をSYSTEM関数だけで処理するのは、SYSTEM関数は、1つのコマンドがコマンドプロンプトで実行されるとコマンドプロンプトが終了してしまうという性質上不可能だと思います。少なくとも私の知識上では無理です。 というわけで、SYSTEM関数、または他の関数でもいいのですが、コマンドプロンプト上で複数のコマンドを実行するプログラムはどのように作成したらよいのかを教えてくださると幸いです。

  • 実行中のプロセスのシステムコールフックについて

    表題の通り,実行中のプロセスのシステムコールのフックについて質問があります. 現在,Linux上の全てのプロセスがどんなシステムコールを使って,どんなリソースにアクセスをしているのか調査しているのですが 具体的には以下のURLのソフトと同じものを,Linux上でC言語を用いて作りたいと考えています. [Process Monitor] http://www.microsoft.com/technet/sysinternals/utilities/processmonitor.mspx いろいろ調べていく中で strace http://www.netadmintools.com/html/1strace.man.html を使うと目的としている調査が実装できそうだということでさっそくいじってみたのですが, strace では既に実行されているプロセスのシステムコールの呼び出しをトレースすることはできないようでした. そこで1点質問なのですが,既に実行中のプロセスのシステムコールをフックするにはどのような方法を使えばいいのでしょうか. お分かりになるかたご回答よろしくお願いします. こちらの開発環境は以下です. OS: Debian 4.0 Kernel: 2.6.20-16 gcc: 4.1.2 (3つとも11/9現在の最新版を使用しています)

  • ubuntuでのC++について教えてください!

    ubuntu環境でC++を使って簡易シュミレーションを行おうとコンパイルまでは通るのですが実行ができません。何が問題でしょうか? 実行時にはこのようなエラーメッセージが表示されます。 error while loading shared libraries: libvtkRendering.so.5.2: cannot open shared object file: No such file or directory

  • system()に関して

    C言語system()の使用方法に関する質問です。 以下の形式にてsystem()を使用した場合 system()にて実行しているコマンドではなく system()自体のエラー発生時に エラーコードの取得は可能でしょうか。 ret_code = system( buf ); ret_code = WEXITSTATUS(ret_code); free( buf ); return ret_code; 以上ご教授の程よろしくお願い致します。

  • 実行可能jarを実行できない

    PCを替えたら実行可能jarの実行に"javar -jar"が必要になりました。 ubuntu10.04(oracle java 1.6)のeclipseで作り、別のubuntu10.04(oracle java 1.6)なPCで使っていた実行可能COMMAND.jarがubuntu12.04(oracle java 1.7)で実行すると "バイナリファイルを実行できません" となります。 COMMAND.jarへのパスは通っています。 $ java -jar COMMAND.jar なら実行できます。 どうすればjavaコマンド無しに実行できますでしょうか。 2013年6月2日

    • ベストアンサー
    • Java
  • Ubuntuに関してです。

    先ほどUbuntu8.0をCDにインストールしました。 その後Cドライブにインストールしようかと思ったんですがパーティションの割り当てなど少し怖くなってやめてUSBにインストールしました。 それで、その後WindowsXPを起動したら、「ディスクのファイルシステム構造が壊れており、使用できません。ボリュームC:に対してCHKDDSKユーティリティを実行してください」と右下にずっとでています。 IEなら大丈夫なんですがなぜかOperaだとこうなります。 怖くて怖くて仕方ありません。助けてください。(中学3年です。文章がおかしかったらすみません。)