我有一个注册了atfork
处理程序的库(通过pthread_atfork()
),该处理程序在fork()
调用时不支持多个线程。就我而言,我不需要分叉的环境中使用,因为我要的是调用exec()
右后fork()
。所以,我想要fork()
但没有任何atfork
处理程序。那可能吗?我会错过任何重要的案例吗?
有关背景信息,该库为OpenBlas,此处和此处均描述了该问题。
您可以使用vfork()
(NPTL实现不调用fork处理程序)。尽管POSIX已从vfork
标准中删除,但您的实现中可能会使用它。
当使用NPTL线程库的多线程程序调用vfork()时,不会调用使用pthread_atfork(3)建立的分叉处理程序。在这种情况下,使用LinuxThreads线程库在程序中调用Fork处理程序。(有关Linux线程库的描述,请参见pthreads(7)。)
或者,posix_spawn()
。这类似于vfork
。手册页说:
根据POSIX,它未指定在调用posix_spawn()时是否调用通过pthread_atfork(3)建立的fork处理程序。在glibc上,仅当使用fork(2)创建子项时才调用fork处理程序。
或者,syscall
直接使用SYS_clone
。SYS_clone
是用于在Linux上创建线程和进程的系统调用号。所以syscall(SYS_clone, SIGCHLD, 0);
应该工作,只要你会立刻EXEC键。
syscall(SYS_fork);
(由Shachar回答)也可能会起作用。但是请注意,SYS_fork
在某些平台(例如aarch64,ia64)上不可用。SYS_fork
在Linux中被认为是过时的,仅是为了向后兼容,Linux内核使用SYS_clone创建所有“类型”的进程。
(注意:这些选项主要限于glibc / Linux)。
我怎么才能修好这个?
版本 维特。x核心:3.5.0 vert. x redis客户端:3.5.0 上下文 2018-06-02 17:40:55.981错误4933---[ntlop-thread-2]io.vertx.redis.impl.重新连接:没有处理程序等待消息:14751915 2018-06-02 17:41:10.937错误4933---[ntloop-thread-2]io。维特斯。雷迪斯。impl
亲爱的史塔克弗劳尔, Swift/UIKit上的任何专家都可以在下面的屏幕截图中看到我做错了什么吗? Xcode似乎找不到基于标题、样式和处理程序的UIAlertAction的方便初始值设定项,我也不知道有任何其他方式来初始化UIAlertAction。实际上,处理器不会为零。 先谢谢你了, 杰米
问题内容: https://cloud.google.com/appengine/docs/go/users/ 我在这里看到他们没有指定使用任何路由器…:https : //cloud.google.com/appengine/docs/go/config/appconfig 在与Golang一起使用的Google Cloud中,它表示要在中指定每个处理程序。这是否意味着我们不应该使用第三方路由器
我正在构建一个应用程序,其中微服务通过RabbitMQ(请求-响应模式)进行通信 一切正常,但我仍然有一个错误“远程服务中没有定义匹配的消息处理程序。”- 当我向客户端应用程序发送帖子时,它只需通过客户端(ClientProxy)发送包含数据的消息,消费者应用程序就会响应。此功能实际上可以工作,但始终只能第二次使用。我知道这听起来很奇怪,但在我的第一个POST请求中,总是有来自客户的错误,我的每一
创建了一个项目' spark-udf ' 建造它 但是下面一行给了我例外: 例外: 线程“main”org.apache.spark.sql中出现异常。AnalysisException:UDAF“com.sark.udf.UpperCase”没有处理程序。请改用sparkSession.udf.register(…)。;第1行位置7,位于org.apache.spark.sql.catalyst