计算克隆函数的变量参数数

时间:2012-06-25 14:50:52

标签: c linux gcc x86-64 variadic-functions

我正在尝试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函数,我必须知道传入的参数的数量。我该怎么做?

4 个答案:

答案 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 ");

注意:我在tlspid_t之间添加了一个逗号,我认为手册页中有一个拼写错误。

然后讨论论据ptidctid。所以我继续检查文档,对于那些定义了这些额外参数的情况,那就是如何从va_list读取它们。