宇宙ドーナツ研究会

セキュリティ系お勉強メモ

関数ポインタについて

宣言方法

カッコで括るのは、int * 型変数を返す関数と区別するため。

int (*pfunc)(int a,int b);    // 関数ポインタ
int *pfunc(int a, int b);     // int * 型変数を返す関数

#include <stdio.h>

void add(int i, int j){
    printf("add:%d\n", i + j);
}

void sub(int i, int j){
    printf("sub:%d\n", i - j);
}

int main(){
    void (*funcs[2])(int, int) = {sub, add};
    funcs[0](10, 3);  // 13
    funcs[1](10, 3);  // 7
}

関数ポインタの型は、typdefしておくと楽。

typedef void (*MYFUNC)(int, int);

int main(){
    MYFUNC func[2] = {sub, add};
    func[0](10, 3);
    func[1](10, 3);
}

mmapでファイルとマッピングしたメモリへの書き込み後、msyncは必要か

mmapマッピングされたメモリ領域に対して書き込みをしても、 msyncは絶対必要というわけではない。

書き込みをすれば、それはいずれ(カーネル側の都合の良いタイミングで)、ファイルに反映されるから。

#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>

int main(int argc, char* argv[])
{
    int fd;
    char *cp;

    fd = open("/home/user/labo/mmap/tmp", O_RDWR);
    cp = mmap(NULL, sizeof(char), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

    puts("now read");
    printf("%c\n", *cp);

    *cp = *cp + 1;
    puts("now written");
    printf("%c\n", *cp);

    return 0;
}

以下、結果。 msyncしなくても、ファイル中の値がインクリメントされていくのがわかる。

user @ makeos:~/labo/mmap$ cat tmp
a
user @ makeos:~/labo/mmap$ gcc -o mmap mmap.c
user @ makeos:~/labo/mmap$ echo a > tmp
user @ makeos:~/labo/mmap$ ./mmap 
now read
a
now written
b
user @ makeos:~/labo/mmap$ ./mmap 
now read
b
now written
c