V2EX上牛X程序员很多, 希望能提供一些思路, 或者别的语言的做法也行.
困扰已久的问题, C语言, 链接了第三方的开源库, 这个开源库里一些出错处理(比如网络阻塞等情况)在失败时, 会使用exit(1), 还有assert等, 直接终止整个程序了.
我需要他能一直运行的, 出错了重启这个库, 或者至多仅仅这个线程挂掉.
比如: openvpn, 链接的程序, 如果参数配置错误, 直接整个程序崩溃.
有没有什么trick的方法, 把exit() 这种函数直接屏蔽掉.
|  |      1goool      2014-12-25 17:54:25 +08:00 1、既然是开源的,可考虑改写代码; 2、在独立的进程里运行这个库,数据以通信方式交换。 | 
|  |      2qiukun      2014-12-25 18:03:23 +08:00 via Android hook | 
|  |      3Akagi201 OP | 
|  |      4way2exluren      2014-12-25 19:52:10 +08:00 举个例子,如果你不包含#include <stdio.h>的话,自己写一个exit()函数,自己的函数会被链接替代了标准库里的exit。 我觉得可以从这方面试试 | 
|  |      5way2exluren      2014-12-25 19:58:13 +08:00 哦写错了,是 <stdlib.h> | 
|  |      6nealfeng      2014-12-25 20:21:59 +08:00 那你就写个监测程序呗。可以多进程或线程。 | 
|  |      7KDr2      2014-12-25 20:47:36 +08:00 @way2exluren 貌似跟头文件没关系,跟链接顺序关系比较大,自定义个exit,链接是放前面貌似就可以了,如果还需要调原来 libc 的 exit 用 dlopen/dlsym 找出来调。 | 
|  |      8KDr2      2014-12-25 20:50:54 +08:00 另外,exit(1) 这个写法,一般指叫做 exit 的常用外部命令 (不过现实中貌似没有这个),exit(3) 指 c library 里的函数。 | 
|  |      9way2exluren      2014-12-25 21:12:33 +08:00 @KDr2 如果#include <stdlib.h> 不管放在前面还是后面,都会报错的。因为重复定义了exit函数。符号冲突。 | 
|  |      10way2exluren      2014-12-25 21:14:00 +08:00  1 顺便如果楼主你有源代码。可以直接用一个宏#define exit(x)  myexit(x) 全局替换。然后编译成库 | 
|  |      11qiukun      2014-12-25 21:16:07 +08:00  1 | 
|  |      12KDr2      2014-12-25 22:12:26 +08:00  1 @way2exluren 头文件里只有声明,怎么也到不了重复定义那步吧 [000]kdr2@Debian-X230:~$ cat x.c #include <stdlib.h> void exit(int status){abort();}; [000]kdr2@Debian-X230:~$ gcc -Wall -c x.c -o x.a [000]kdr2@Debian-X230:~$ ls x.a x.a [000]kdr2@Debian-X230:~$ 有什么问题。 | 
|  |      13way2exluren      2014-12-25 22:19:20 +08:00 @KDr2 你是对的,我说错了。 | 
|      14yangff      2014-12-25 22:21:58 +08:00 via Android 把exit函数改成ret |