Linuxシステムコールの出力をC / C ++で取得するにはどうすればよいですか?

ハメド・カムラヴァ

helloworldLinuxカーネルに簡単なシステムコールを追加しました

sys_helloworld

#include <linux/kernel.h>

asmlinkage long sys_helloworld(void)
{
        printk("Hello world\n");
        return 0;
}

Hello worldカーネルログに出力するだけです。

私はsys_helloworldそのようにシステムコールを呼び出しました:

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
   long int a = syscall(314); // 314 is the line number of sys_helloworld in syscall table
   printf("System call sys_helloworld returned %ld\n", a);
   return 0;
}

上記のプログラムはHello world、カーネルログに正常に出力されます。

私の質問 :

プログラムsys_helloHello worldカーネルログに出力される)の出力を取得するにはどうすればよいですか?

フィリペゴンサルベス

システムコールに2つの引数を追加する必要があります。書き込み先のバッファーとそのサイズです。次に、を使用snprintf()して、必要な文字列を印刷できます正しいsyscall定義マクロを使用していることを確認する必要があります。2つの引数が必要になるため、SYSCALL_DEFINE2ここで必要になります。

#include <linux/kernel.h> /* For snprintf() */
#include <sys/syscall.h> /* For SYSCALL_DEFINE* macros */
SYSCALL_DEFINE2(sys_helloworld, char *, buff, size_t, buff_sz)
{
        snprintf(buff, buff_sz, "Hello world\n");
        return 0;
}

完全を期すために、またコンテキストによっては、戻り値を、文字列が切り捨てられたかどうかを確認できるものに変更することをお勧めします。

ユーザーコードは次のように呼び出すことができます:

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
   char buf[32];
   long int a = syscall(314, buf, sizeof(buf));
   printf("System call sys_helloworld returned %ld\n", a);
   printf("buf = %s\n", buf);
   return 0;
}

引数のないシステムコールの場合でもSYSCALL_DEFINE*、手動で入力するのではなくマクロを使用してシステムコールを定義する方が一般的に良いスタイルであることに注意してくださいasmlinkage long ....(を使用しますSYSCALL_DEFINE0)。これらのマクロはで定義されているinclude/sys/syscall.hので、使用する必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Linuxシステムコールの出力をC / C ++で取得するにはどうすればよいですか?

分類Dev

C#で月末を取得するにはどうすればよいですか?

分類Dev

C ++ 14で-nanを取得するにはどうすればよいですか?

分類Dev

C ++例外のCONTEXTを取得するにはどうすればよいですか?

分類Dev

C#でマイクのフルネームを取得するにはどうすればよいですか?

分類Dev

system()システムコール以外のメソッドでC / C ++を使用してLinuxでファイル機能を取得するにはどうすればよいですか?

分類Dev

CでLinuxコマンドの場所を取得するにはどうすればよいですか?

分類Dev

nimプログラムのcコードを取得するにはどうすればよいですか?

分類Dev

C#でC ++の「const」に相当するものを取得するにはどうすればよいですか?

分類Dev

C#で特定の国から国コードを取得するにはどうすればよいですか?

分類Dev

Cでローカルシェル変数を取得するにはどうすればよいですか?

分類Dev

LinuxのCでIPアドレスを取得するにはどうすればよいですか?

分類Dev

Ctrl + Cで死なないように `bundleconsole`を取得するにはどうすればよいですか

分類Dev

Cプログラムで適切な出力を取得するにはどうすればよいですか?

分類Dev

LinuxでCでファイル長を取得するにはどうすればよいですか?

分類Dev

Selenium C#-テーブルの合計行数を取得するにはどうすればよいですか?

分類Dev

Webサービスからjson出力をc#のデータテーブルとして取得するにはどうすればよいですか?

分類Dev

C ++でコードの実行時間を取得するにはどうすればよいですか?

分類Dev

IArgumentCompleterのC#実装で現在のファイルシステムの場所を取得するにはどうすればよいですか?

分類Dev

Ubuntu 18(bionic)でC ++ 17 /ファイルシステムヘッダーを使用してlibstdc ++を取得するにはどうすればよいですか?

分類Dev

Ubuntu 18(bionic)でC ++ 17 /ファイルシステムヘッダーを使用してlibstdc ++を取得するにはどうすればよいですか?

分類Dev

Cで任意のルートを取得するにはどうすればよいですか?

分類Dev

Cでファイルシステムの名前とサイズを取得するにはどうすればよいですか?

分類Dev

コンピューターでC標準を取得するにはどうすればよいですか?

分類Dev

C ++でMongoDBの現在のインスタンスを取得するにはどうすればよいですか?

分類Dev

Linuxでは、bashコマンドではなくC関数のマニュアルページを取得するにはどうすればよいですか?

分類Dev

これらのシンボルをC ++で出力するにはどうすればよいですか?

分類Dev

c#でdiscordコマンドの作成者を取得するにはどうすればよいですか?

分類Dev

C#フォームの幅を取得するにはどうすればよいですか?

Related 関連記事

  1. 1

    Linuxシステムコールの出力をC / C ++で取得するにはどうすればよいですか?

  2. 2

    C#で月末を取得するにはどうすればよいですか?

  3. 3

    C ++ 14で-nanを取得するにはどうすればよいですか?

  4. 4

    C ++例外のCONTEXTを取得するにはどうすればよいですか?

  5. 5

    C#でマイクのフルネームを取得するにはどうすればよいですか?

  6. 6

    system()システムコール以外のメソッドでC / C ++を使用してLinuxでファイル機能を取得するにはどうすればよいですか?

  7. 7

    CでLinuxコマンドの場所を取得するにはどうすればよいですか?

  8. 8

    nimプログラムのcコードを取得するにはどうすればよいですか?

  9. 9

    C#でC ++の「const」に相当するものを取得するにはどうすればよいですか?

  10. 10

    C#で特定の国から国コードを取得するにはどうすればよいですか?

  11. 11

    Cでローカルシェル変数を取得するにはどうすればよいですか?

  12. 12

    LinuxのCでIPアドレスを取得するにはどうすればよいですか?

  13. 13

    Ctrl + Cで死なないように `bundleconsole`を取得するにはどうすればよいですか

  14. 14

    Cプログラムで適切な出力を取得するにはどうすればよいですか?

  15. 15

    LinuxでCでファイル長を取得するにはどうすればよいですか?

  16. 16

    Selenium C#-テーブルの合計行数を取得するにはどうすればよいですか?

  17. 17

    Webサービスからjson出力をc#のデータテーブルとして取得するにはどうすればよいですか?

  18. 18

    C ++でコードの実行時間を取得するにはどうすればよいですか?

  19. 19

    IArgumentCompleterのC#実装で現在のファイルシステムの場所を取得するにはどうすればよいですか?

  20. 20

    Ubuntu 18(bionic)でC ++ 17 /ファイルシステムヘッダーを使用してlibstdc ++を取得するにはどうすればよいですか?

  21. 21

    Ubuntu 18(bionic)でC ++ 17 /ファイルシステムヘッダーを使用してlibstdc ++を取得するにはどうすればよいですか?

  22. 22

    Cで任意のルートを取得するにはどうすればよいですか?

  23. 23

    Cでファイルシステムの名前とサイズを取得するにはどうすればよいですか?

  24. 24

    コンピューターでC標準を取得するにはどうすればよいですか?

  25. 25

    C ++でMongoDBの現在のインスタンスを取得するにはどうすればよいですか?

  26. 26

    Linuxでは、bashコマンドではなくC関数のマニュアルページを取得するにはどうすればよいですか?

  27. 27

    これらのシンボルをC ++で出力するにはどうすればよいですか?

  28. 28

    c#でdiscordコマンドの作成者を取得するにはどうすればよいですか?

  29. 29

    C#フォームの幅を取得するにはどうすればよいですか?

ホットタグ

アーカイブ