1

Cコードでkernel.shmmaxの値を取得したい(シェルコマンド「$ sysctl -q kernel.shmmax」を使用して、centos5.0、centos6.0、およびubuntu10.04でクエリを実行します)。

次のコードを使用して見つけました。

#include <sys/sysctl.h>

const int SHM_ERROR=1;

main(){
    int name[] = {KERN_SHMMAX};
    int namelen = 1;
    int oldval[1];
    size_t oldlen = sizeof(oldval);
    int rv = sysctl(name, namelen, (void*) oldval, &oldlen, NULL, 0);
    if (rv!=0) {
        fprintf(stderr, "while quering for shared memory size, sysctl returned error: %s\n", strerror(errno));
        return SHM_ERROR;
    }
    else{
        return 0;
    }
}

上記のコードを実行すると、次のエラーが発生します。

共有メモリ サイズのクエリ中に、sysctl がエラーを返しました: ディレクトリではありません

このエラーが発生する理由がわかりません。私はそれをグーグルで検索し、ライブラリが調べようとするパスに問題があることを発見しました。

上記のコードを GDB で実行しようとしましたが、コードは関数 sysctl にステップ インしません。それ以外の場合は、より多くの情報を提供できたはずです。

データ ポイント: 次のコマンドを使用して、記載されているすべてのオペレーティング システムのコマンド ラインから kernel.shmmax を簡単に設定および取得できます。

$ sysctl -q kernel.shmmax

$ sysctl -w kernel.shmmax=1000000000

ありがとう

4

2 に答える 2

4

sysctlユーザースペースコードから呼び出すべきではありません。ページからman

Glibcは、このシステムコールのラッパーを提供していません。syscall(2)を使用して呼び出します。

というか...呼び出さないでください。このシステムコールの使用は長い間推奨されておらず、愛されていないため、将来のカーネルバージョンでなくなる可能性があります。今すぐプログラムから削除してください。代わりに/proc/sysインターフェースを使用してください。

代わりにこれを試してみてください:

#include <stdio.h>                                                                                                                  

#define SHMMAX_SYS_FILE "/proc/sys/kernel/shmmax"

int main(int argc, char **argv)
{
    unsigned int shmmax;
    FILE *f = fopen(SHMMAX_SYS_FILE, "r");

    if (!f) {
        fprintf(stderr, "Failed to open file: `%s'\n", SHMMAX_SYS_FILE);
        return 1;
    }

    if (fscanf(f, "%u", &shmmax) != 1) {
        fprintf(stderr, "Failed to read shmmax from file: `%s'\n", SHMMAX_SYS_FILE);
        fclose(f);
        return 1;
    }

    fclose(f);

    printf("shmmax: %u\n", shmmax);

    return 0;
}
于 2012-08-22T15:55:15.387 に答える
1

strace をインストールすると、sysctl が _sysctl() 呼び出しまたは syscall() 呼び出しの代わりに open() 呼び出しで /proc/sys/kernel/shmmax を参照することがわかります。

于 2012-08-22T20:36:40.827 に答える