fork()后出现libCurl SSL错误

我正在开发一个FUSE驱动程序,当它作为一个守护进程(没有-f或-d标志)运行时,所有通过libcurl进行的https请求都失败。 我能够通过https请求,分支和返回父进程,然后从新进程发出第二个请求来重现错误。 如果我删除fork电话或发出一个HTTP请求没有错误。

我现在正在制作一个官方的错误报告,但是有谁知道我可以如何使它工作?

这是我的代码和(日志文件)输出:

注意:如果你运行我的程序,pipe道到/ dev / null,因为默认情况下,libcurl发送接收到的缓冲区到stdout。

 #include <curl/curl.h> #include <string> #include <unistd.h> #include <iostream> using namespace std; void log(string str) { //TODO: remove static const char logfile[] = "/home/austin/megalog"; FILE *f = fopen(logfile, "a"); fwrite(str.data(), str.size(), 1, f); fclose(f); cout << str; } int main(int argc, char *argv[]) { string url = "https://www.google.com/"; char errBuf[1024]; CURLcode err; curl_global_init(CURL_GLOBAL_DEFAULT); CURL *handle = curl_easy_init(); curl_easy_setopt(handle, CURLOPT_URL, url.c_str()); curl_easy_setopt(handle, CURLOPT_ERRORBUFFER, errBuf); if ((err = curl_easy_perform(handle))) { log("first request failed\n"); return 1; } curl_easy_cleanup(handle); if(fork()) return 0; handle = curl_easy_init(); curl_easy_setopt(handle, CURLOPT_URL, url.c_str()); curl_easy_setopt(handle, CURLOPT_ERRORBUFFER, errBuf); if ((err = curl_easy_perform(handle))) { log(string("curl error while sending: (") + to_string(err) + ") " + curl_easy_strerror(err) + "\n"); log(errBuf); } else log("no error\n"); return 0; } 

…和输出:

 $ g++ -std=c++11 main.cpp -lcurl $ rm -f log $ ./a.out > /dev/null $ cat log curl error while sending: (35) SSL connect error A PKCS #11 module returned CKR_DEVICE_ERROR, indicating that a problem has occurred with the token or slot. 

我正在使用(最新的)libcurl版本7.29.0,(最新的)openssl版本1.0.1e,并且运行内核版本为3.7.4的Fedora 18。

为了使这个工作,你需要在fork curl_global_init再次调用curl_global_cleanupfork curl_global_init再调用curl_global_cleanup 。 libcurl邮件列表中的某个人提到,在初始化需要初始化的库之后调用fork时,这是一个常见的问题。