makecontext
的手册页指出,argc
之后的参数仅应为integer(int):
如果我们看看pthread_create
或clone
系统调用,它们有一个要传递给func的void*
参数,而struct的指针可以包含用户希望拥有的任何数量的数据,而这两个函数不需要使用va_args。所以我的问题是为什么makecontext
不使用这种技术,即使用空指针而不是argc和va_args?
最佳答案
这是导致makecontext
消失/删除的设计缺陷。请参阅包含在其中的最新版本POSIX的合理文本:
http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html
请注意,为了使makecontext
的实现实际调用func
,它必须知道如何设置堆栈框架以使用正确的数量和参数类型输入到函数。如果要求所有参数都具有相同的类型(int
),则可以仅从数字argc
得知。如果允许它们具有不同的类型,则调用者将不得不以某种方式将类型的规范作为参数传递给makecontext
;一个简单的计数不足以知道如何将它们从va_list
接收到的makecontext
复制到堆栈帧中以输入func
。
当然makecontext
的func
应该只接受一个void *
,然后问题就永远不会出现。但事实并非如此。