• ベストアンサー

システムコールについて

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

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

  • ベストアンサー
  • v-north
  • ベストアンサー率100% (1/1)
回答No.2

プロセスの起動execcから、dllロードするためのopen/closeとか、実際のmainまで行くのに、確かに各種システムコールが呼ばれていますね。このあたりはどのプロセスをstraceしても同じようなものですから、慣れてしまうと、目的のシステムコールはこの当たりかと(引数も目印となりますし。)推測できるようになります。 ちなみに、printfは、ファイルIDを1としてwriteシステムコール(ファイル出力と同じ。)を呼んでいるに過ぎません。

tardyyak
質問者

お礼

なるほど。お礼を忘れていました汗 ありがとうございます。

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.1

straceを利用するとか gdbなどのデバッガなどで処理をおっかけるとか 一番確実なのはライブラリのソースを読むことだけど。

tardyyak
質問者

補足

straceは使ったのですが、さまざまなシステムコールがでてきます。その中で、printfを実行するために必要なシステムコールを特定するために何をすればいいかがわかりません。説明不足でした。すいません。

関連するQ&A

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

    アセンブリ言語で、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) これについて詳しく教えていただけないでしょうか?すみません。

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

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

  • Windowsのシステムコール呼び出し

    アセンブラでシステムコールを呼び出したいのですが、 Linuxとかだとシステムコールの一覧みたいのが載ってるのですが、 Windowsのシステムコールの一覧みたいのが見つかりません。 一覧が載っているようなサイトってありませんか?? とりあえずLinuxの11番(C言語で言うexecv関数)みたいのが使いたいのですが。。。

  • システムコールと標準ライブラリの正しい使い方を教えて下さい

    システムコールって何でしょうか。 C言語初心者なので、変な質問だったら、すみません。 システムコールと標準ライブラリにおける、関数の違いを教えて頂けませんでしょうか。 例えばファイル入出力で用いる openとfopenは何が違うのでしょうか? 私はそもそも、システムコールというものが判っていない状態です。 いつも標準ライブラリを参考にしていたものですから・・。 更に似た使い方をすると思いますが、使える範囲等どちらが広いのでしょうか。 よろしくお願いします。

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

    表題の通り,実行中のプロセスのシステムコールのフックについて質問があります. 現在,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現在の最新版を使用しています)

  • Linux/Windowsのシステムコール

    CentOS 5.5 + Eclipse CDT で C++ のプログラミングを始めたばかりです。 プログラムを作成するにあたって、今後 Windows へ移植したときに移植しやすいプログラムを作成したいと考えています。 (現段階ではまだ標準出力に何か表示するお粗末なものですが) 素人考えでは、システムコールを使用すると他プラットフォームへ移植したときに同等のシステムコールがないと実装を大きく変更しなければならなくなるので、あらかじめどれが固有のシステムコールかを判断したいと思っています。 例えば Linux では待ち行列を実現するのに mkfifo システムコールが使えるけど、Windows では使えないから待ち行列をあらかじめロジックで実現しよう、という感じです。 (あくまで例なので、Windows の FIFO の API を使えばいいじゃん、というのはナシで) なので、Linux および Windows でシステムコール一覧を参照する方法を教えて頂きたいです。 まあ、STLでもプラットフォームが変われば動く保証はないみたいなので、Javaみたいなクロスプラットフォームのようにはいかないと思いますが。。。 よろしくお願いします。

  • AWKからのモジュールコール

    AWKから、実行モジュール(たとえばCで書いたプログラム)をコールする事は可能でしょうか?ご存知の方教えていただけますか?

  • Linux Cからのメール送信

    Linux上Cプログラムでメール送信を行いたいと思って います。 Cからシステムコールでsendmailを実行する方法は わかったのですが、純粋にSMTPサーバーにC言語から アクセスして送信する方法など可能なのでしょうか?

  • c言語のついて

    c言語で・・・ #include <stdio.h> main() {   printf("こんにちは!"); } というプログラム(適当に作りました)が動きません。 ドコを間違えていますか?

  • C言語 fork()について

    C言語 fork()について C言語でSystem Call fork()というものがあるそうで、まずは http://cai.int-univ.com/sugsi/Lecture/NetProg/chapter5/fork.html こちらのサイトの例をvisual studio 2008で実行させてみようと思ったのですが、以下のエラーが表示されてしまいました。 1>c:\users\user\documents\visual studio 2008\projects\project1\system call fork\system call fork\system call fork.cpp(3) : fatal error C1083: include ファイルを開けません。'unistd.h': No such file or directory ソースは以下のものです。 #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int pid; char msg[256]; sprintf(msg, "hello world"); //sprinf()でmsgにhello worldを格納する pid = fork(); if(pid == 0) printf("%s, child process\n", msg); else printf("%s, parent process\n", msg); return 0; } #include <unistd.h>について注意されていますが、これは何なのでしょうか? #include<stdio.h>ならprintf()などの基本的な関数を使うのに必要なものと覚えたので、 #include <unistd.h>もfork()を使うときに必要なものだろう程度に思っているのですが、どうすれば、まずこのプログラムが実行できるんでしょうか? No such file or directoryと書かれているぐらいですから、下準備としてこのプロジェクトが保存されている場所でtxtファイルか何かを準備しておく必要があるということですかね...