为什么makecontext的func只接受整数参数

时间:2017-03-20 01:36:36

标签: c linux posix

makecontext的手册页指出argc之后的参数应该只是整数(int):

  

...函数func被调用,并传递了一系列跟随argc的整数(int)参数

如果我们查看pthread_createclone系统调用,它们会有一个void*参数传递给func,而struct的指针可以包含任意数量的数据用户希望拥有,而这两个功能也不需要使用va_args。所以我的问题是为什么makecontext不使用这种技术,即使用void指针而不是argc和va_args?

1 个答案:

答案 0 :(得分:1)

这是导致makecontext消亡/删除的设计缺陷。请参阅包含在其中的POSIX的最新版本的有理文本:

http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html

  

将ISO / IEC 9899:1999标准纳入本规范后,发现ISO C标准(第6.11.6节)规定使用带空括号的函数声明符是一个过时的特性。因此,使用函数原型:

void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...);
     

正在利用ISO C标准的过时功能。因此,严格符合POSIX的应用程序不能使用此表单。因此,getcontext(),makecontext()和swapcontext()的使用被标记为过时。

     

ISO C标准中没有办法指定一个非过时的函数原型,表明将使用任意类型的任意数量(包括零)参数调用函数(包括整数,指向数据的指针,指向函数和复合类型)。

     

用许多ISO C标准兼容函数替换makecontext()处理各种数量和类型的参数会强制重写makecontext()的所有现有用法,几乎没有增益。今天很少有应用程序使用* context()例程。那些使用它们的人几乎总是使用它们来实现协同例程。通过维护makecontext()的XSH,Issue 5规范,现有的应用程序将继续工作,尽管它们不能被归类为严格符合要求的应用程序。

     

ISO C标准中没有办法(不使用过时行为)指定使用ISO C标准的XSH,Issue 5规范中标准,严格符合行为的功能。线程可用于实现makecontext(),getcontext()和swapcontext()提供的功能,但它们使用起来更复杂。有人认为发明新的ISO C标准兼容接口描述了可以用XSH,第5版功能完成什么,然后转换应用程序来使用它们会比转换使用它们的应用程序更难以使用线程。

请注意,为了实现makecontext实际调用func,它必须知道如何设置堆栈帧以输入具有正确数量和类型的参数的函数。如果要求所有参数具有相同的类型(int),则可以从数字argc知道该参数。如果允许它们具有不同的类型,则调用者必须以某种方式将类型的规范作为参数传递给makecontext;简单计数不足以知道如何将va_listmakecontext收到的func复制到堆栈帧以进入makecontext

当然func void *应该只采用一个pandas.DataFframe,然后问题永远不会出现。但它没有。