我只有希望在调用过程具有一定权限的情况下才希望调用的一组函数。我有一个工作的访问控制模块来执行检查,我只想在一个地方定义这组功能,而不必在每次被称为代码内时都手动进行。
因此,假设一个受保护的函数是fread()
,我希望进行一次调用:accessCheck(processId,fread)
,而不必在要进行调用的地方专门输入。我可以在某个地方以某种方式定义fread()
,使其始终像这样“ protected
”吗?
这是C
左右。
答案 0 :(得分:0)
您可以为每个受保护的函数定义一个宏,如下所示:
#include <stdio.h>
#undef fread
#define fread(ptr, size, n, fp) \
(accessCheck(getpid(), (void (*)(void))fread ? (ssize_t)-1 : \
fread((ptr), (size), (n), (fp)))
在这里,getpid()
是返回当前进程ID的函数,而accessCheck
具有原型:
int accessCheck(pid_t pid, void (*fn)(void));
在这里,pid_t
是进程ID的类型。 fn
具有类型(void (*)(void))
的泛型函数指针。 fn
不会调用accessCheck
,只会检查指针值。 accessCheck
成功时应返回0,失败时应返回一些非零值。失败时,accessCheck
还应将errno
设置为适当的值。
#include <stdio.h>
和#undef fread
行是因为允许#include <stdio.h>
定义行为与功能fread
相同的宏fread
(尽管看起来不太可能这样做),而我们想替换该宏。宏替换文本中对fread
的引用很好,因为C宏不是递归的。