如何定义自己的线程函数与第三方系统兼容
来源:互联网 发布:windows能开发ios吗 编辑:程序博客网 时间:2024/06/05 11:21
在多线程的环境中,我们需要有线程创建函数来创建需要的线程,一般的系统都是有自己的线程创建函数的,但是有的系统没有,或者说两个系统不兼容,那么我们就需要有自己的线程创建函数来兼容第三方,一般在模拟线程创建的时候都是用进程来实现的,下面就是一个例子:
static intpthread_create(sp_pthread_t *thread, const void *attr, void *(*thread_start)(void *), void *arg){pid_t pid;struct pam_ctxt *ctx = arg;sshpam_thread_status = -1;switch ((pid = fork())) {case -1:error("fork(): %s", strerror(errno));return (-1);case 0:close(ctx->pam_psock);ctx->pam_psock = -1;thread_start(arg);_exit(1);default:*thread = pid;close(ctx->pam_csock);ctx->pam_csock = -1;sshpam_oldsig = signal(SIGCHLD, sshpam_sigchld_handler);return (0);}}
typedef pthread_t sp_pthread_t;#elsetypedef pid_t sp_pthread_t;#endifstruct pam_ctxt {sp_pthread_t pam_thread;int pam_psock;int pam_csock;int pam_done;};static void sshpam_free_ctx(void *);static struct pam_ctxt *cleanup_ctxt;#ifndef UNSUPPORTED_POSIX_THREADS_HACK/* * Simulate threads with processes. */static int sshpam_thread_status = -1;static mysig_t sshpam_oldsig;static voidsshpam_sigchld_handler(int sig){signal(SIGCHLD, SIG_DFL);if (cleanup_ctxt == NULL)return;/* handler called after PAM cleanup, shouldn't happen */if (waitpid(cleanup_ctxt->pam_thread, &sshpam_thread_status, WNOHANG) <= 0) {/* PAM thread has not exitted, privsep slave must have */kill(cleanup_ctxt->pam_thread, SIGTERM);if (waitpid(cleanup_ctxt->pam_thread, &sshpam_thread_status, 0) <= 0)return; /* could not wait */}if (WIFSIGNALED(sshpam_thread_status) && WTERMSIG(sshpam_thread_status) == SIGTERM)return;/* terminated by pthread_cancel */if (!WIFEXITED(sshpam_thread_status))sigdie("PAM: authentication thread exited unexpectedly");if (WEXITSTATUS(sshpam_thread_status) != 0)sigdie("PAM: authentication thread exited uncleanly");}/* ARGSUSED */static voidpthread_exit(void *value){_exit(0);}
0 0
- 如何定义自己的线程函数与第三方系统兼容
- 如何在自己的信息管理系统里集成第三方权限控制组件
- 如何在自己的信息管理系统里集成第三方权限控制组件
- 如何创建自己的第三方SDK(环境搭建)
- Android Studio如何把自己的工程变成第三方库,如何导入第三方库和删除第三方库
- 如何通过自己的应用,打开自己手机第三方应用
- 第三方物流管理系统的设计与实现
- 记录自己的第三方接入
- ffmpeg 添加自己的第三方库
- 在自己的Android系统上去处理第三方应用的一些问题
- 菜鸟学php扩展 之 实战如何在扩展里调第三方函数(标准库/原生/自己写的)(六)
- 第三方或自己开发的apk文件编译到系统文件(system.img)中的方法!!!!!
- 如何将第三方的APK 加入到我们自己的 img 里面呢?
- 如何显示第三方的Android市场中自己上传的应用
- 如何保持自己的应用和关联的第三方框架同步更新?
- 教你如何自己制作IP地址查询的API,摆脱第三方API---(一)
- 教你如何自己制作IP地址查询的API,摆脱第三方API---(二)
- Android开发如何在自己的项目中引用第三方代码
- pip install lxml因网络问题失败
- 非常好的理解遗传算法的例子
- JMeter下变量在线程组间的使用
- UIWebView的使用
- 自定义UI制作流程
- 如何定义自己的线程函数与第三方系统兼容
- GDB的命令手册,很不错
- hdu1166线段树单点更新
- UVa227 Puzzle
- Centos镜像地址列表(全)
- java中什么是bridge method(桥接方法)
- poj 2752 Seek the Name, Seek the Fame
- CAMetalLayer&Metal
- linux权限-r-w-代表意思