我正在尝试LD_PRELOAD linux的clone
函数。在我的LD_PRELOADed版本中,我需要在调用原始clone
函数之前记录输入参数。但是,问题是clone
需要可变数量的参数。它被宣布为这样。
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ...
/* pid_t *pid, struct user_desc *tls, pid_t *ctid */ );
现在要将这些参数传递给原始的clone
函数,我必须知道传入的参数的数量。我该怎么做?
答案 0 :(得分:2)
使用va_*
函数,这是使用变量参数列表时的方法。
这是man page,最后还包含一个例子。
答案 1 :(得分:1)
如果有一个NULL终结符,则可以在va_arg
没有返回时调用NULL
。
答案 2 :(得分:1)
对此的正确答案是:您无法计算变量参数函数中的参数数量。
但是,对于clone
函数,您可以通过查看flags
参数来假设参数的数量,因为某些标志需要一些额外的参数。
以CLONE_PARENT_SETTID
标记为例{/ 1}}:
将子线程ID存储在父级和子级内存中 ptid 的位置。 (在Linux 2.5.32-2.5.48中有一个标志CLONE_SETTID执行此操作。)
因此,如果设置了此标志,那么您知道ptid
参数应该存在,并且您可以使用manual page函数来获取它。
然而,没有办法验证用户是否实际传递了参数,这意味着如果用户没有,那么东西可能会出现可怕的错误。
答案 3 :(得分:0)
man page描述了原型:
int clone(int (*fn)(void *), void *child_stack, int flags,
void *arg, ... /* pid_t *ptid, struct user_desc *tls, pid_t *" ctid ");
注意:我在tls
和pid_t
之间添加了一个逗号,我认为手册页中有一个拼写错误。
然后讨论论据ptid
和ctid
。所以我继续检查文档,对于那些定义了这些额外参数的情况,那就是如何从va_list
读取它们。