[c/cpp]:函数指针数组的应用(模拟系统调用)
一、说明
1、 函数指针数组: 一个指针数组,它的元素是函数指针;函数指针数组。
二、程序代码
1 [root@rocky:test]# cat syscalls.c
2 #include <stdio.h>
3 #include <stdlib.h>
4
5
6 // syscall macros
7 #define sys_msg0 0
8 #define sys_msg1 1
9 #define sys_msg2 2
10 #define sys_msg3 3
11
12
13 // important
14 // declaring: a array pointing to functions
15 // int (*sf[10])(int);
16
17
18 // define syscalls - simulate syscalls
19 int msg0(int x)
20 {
21 printf("\t[msg0]#\t syscall_msg0:\t%d\n", x);
22 return 0;
23 }
24
25
26 int msg1(int x)
27 {
28 printf("\t[msg1]#\t syscall_msg1:\t%d\n", x);
29 return 0;
30 }
31
32
33 int msg2(int x)
34 {
35 printf("\t[msg2]#\t syscall_msg2:\t%d\n", x);
36 return 0;
37 }
38
39
40 int msg3(int x)
41 {
42 printf("\t[msg3]#\t syscall_msg3:\t%d\n", x);
43 return 0;
44 }
45
46
47 // important
48 // declaring: a array pointing to functions
49 //
50 // int (*sf[10])(int); |
51 // |
52 // sf[0] = msg0; |
53 // sf[1] = msg1; | wrong, why?
54 // sf[2] = msg2; |
55 // sf[3] = msg3; |
56
57 int (*sf[10])(int) = { msg0, msg1, msg2, msg3 };
58
59
60 // function: execute syscalls
61 int user_syscall(int sno) // sno = syscall number
62 {
63 if ( 0==(sf[sno])(sno) ) {
64 return 0;
65 } else {
66 return 1;
67 }
68 }
69
70
71 // test modules
72 int main(int argc, char *argv[], char *envp[])
73 {
74
75 printf("\n");
76 user_syscall(sys_msg0);
77 user_syscall(sys_msg1);
78 user_syscall(sys_msg2);
79 user_syscall(sys_msg3);
80 printf("\n");
81
82 return 0;
83 }
84 [root@rocky:test]#
三、运行结果
[root@rocky:test]# gcc -o syscalls syscalls.c && ./syscalls
[msg0]# syscall_msg0: 0
[msg1]# syscall_msg1: 1
[msg2]# syscall_msg2: 2
[msg3]# syscall_msg3: 3
[root@rocky:test]#
[root@rocky:test]#
四、参考资料
1. C函数指针与回调函数|菜鸟教程 - https://www.runoob.com/cprogramming/c-fun-pointer-callback.html
本文由 lnlidawei 原创、整理、转载,本文来自于【博客园】; 整理和转载的文章的版权归属于【原创作者】; 转载或引用时请【保留文章的来源信息】:https://www.cnblogs.com/lnlidawei/p/18519238