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