Articles of c + +

处理具有非空读取缓冲区的套接字stream时出现“非法查找”错误

我目前正在使用<sys/socket.h>在Linux x86_64上编写一个服务器应用程序。 通过accept()接受连接后,我使用fdopen()将检索到的套接字封装到FILE*stream中。 写入和读取FILE*stream通常工作得很好,但是一旦我写入了它,套接字变得不可用,而它有一个非空的读取缓冲区。 为了演示目的,我写了一些代码来监听连接,然后使用fgetc()将input逐行读入到读缓冲区中。 如果该行太长而不能放入缓冲区,则不能完全读取,而是在下一次迭代中读取。 #include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> FILE* listen_on_port(unsigned short port) { int sock = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in name; name.sin_family = AF_INET; name.sin_port = htons(port); name.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sock, (struct sockaddr*) &name, sizeof(name)) < 0) perror("bind failed"); listen(sock, 5); int newsock = accept(sock, 0, […]

我应该释放由setlocale返回的指针吗?

int main(int argc, char *argv[]) { char *ret = setlocale(LC_ALL, NULL); // should I free 'ret' ??? // free(ret); return 0; } 我已经在Linux和OS X 10.10上都试过了,在Linux中,我不能调用'free',但是在OS X中,如果我不叫'free',valgrind会抱怨内存泄漏。 ==62032== Memcheck, a memory error detector ==62032== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==62032== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info […]

-finstrument-functions不适用于dynamic加载的g ++共享对象(.so)

我正在用Ubuntu上的g ++共享对象(.so)文件testing-finstrument函数。 我发现了一个奇怪的行为,即只有库是静态链接的,函数似乎才起作用。 如果我用dlopen / dlsym等链接到库,代码的function仍然有效,但它不会调用__cyg_profile *函数。 这里有一些代码来快速重现问题: MyLib.h #ifndef __MYLIB_H__ #define __MYLIB_H__ class MyLib { public: void sayHello(); }; #endif MyLib.cpp #include "MyLib.h" #include <iostream> using namespace std; void MyLib::sayHello() { cout<<"Hello"<<endl; } MyLibStub.cpp(到.so的C接口) #include "MyLib.h" extern "C" void LoadMyLib () { MyLib().sayHello(); } Trace.cpp #include <stdio.h> #ifdef __cplusplus extern "C" { void __cyg_profile_func_enter(void […]

非阻塞networking地址parsing(gethostbyname或getaddrinfo)?

使用经典的nsswitch.confconfiguration: hosts: files dns 尝试使用gethostbyname (或getaddrinfo )parsing名称可能需要一段时间,如果DNS不应答(或configuration不当)。 有没有办法在nsswitch.conf中configuration超时,或使用替代API来pipe理超时?

为什么使用setenv()后环境variables未被设置

我在Linux中编写了一个C程序来使用setenv设置环境variables的值,但是在执行后,当我运行set或export ,环境variables本身似乎是未设置的。 为什么? 这里是代码片段: int main() { char *mallocPtr, *callocPtr, *reallocPtr, *memalignPtr, *vallocPtr; struct sigaction sa; sa.sa_handler=SIGSEGV_handler; sigaction(SIGSEGV, &sa, NULL); if(setenv("ENV1", "3", 1) == 0) printf("ENV1 set to 3\n"); else fprintf(stderr, "setenv failed on ENV1");

g ++ 4.1.2没有在此范围内声明runtime_error

相同的代码在gcc 4.5.2上正常工作,但是当试图在gcc 4.1.2上编译时,我得到错误'runtime_error' was not declared in this scope 。 我有 #include <stdexcept> 这是gcc 4.1.2的问题吗? 代码摘录 // Constructor if (resource cannot be acquired) throw std::runtime_error("Blah Blah");

在Mac上编译C ++程序以在Linux上运行

可能重复: 如何交叉编译从Mac OS X到Linux x86? 我有一个应用程序,我用C ++ / SDL编写,使用FMOD库。 该应用程序是可移植的,编译没有任何代码在Mac和Linux上的变化。 但是有一个令人烦恼的是,当我想发布Linux版本时,我必须运行我的Linux机器,在那里复制源代码(通过USB驱动器,因为我没有networking,这是一个旧的笔记本电脑)并编译它,然后复制它再次通过USB到我的Mac并上传。 我的问题是 – 有没有更好的方法呢? 理想情况下,我可以编译应用程序直接从Xcode在Linux上运行,我为Mac编译它?

如何在C / C ++中以编程方式读取Linux文件权限

我怎样才能以编程方式读取linux文件权限,而不是使用“ls”然后parsing结果。

Xerces C ++ – 加载,读取和保存替代品?

我正在寻找一个教程来加载一个XML文件,阅读它,改变它,最后用C ++保存。 我正在使用Linux Ubuntu并尝试使用Xerces。 用Google和很多时间,我只能加载一个XML文件: #include <xercesc/parsers/XercesDOMParser.hpp> #include <xercesc/dom/DOM.hpp> #include <xercesc/sax/HandlerBase.hpp> #include <xercesc/util/XMLString.hpp> #include <xercesc/util/PlatformUtils.hpp> #include <iostream> using namespace std; using namespace xercesc; int main (int argc, char* args[]) { try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { char* message = XMLString::transcode(toCatch.getMessage()); cout << "Error during initialization! :\n" << message << "\n"; XMLString::release(&message); return […]

如何更新命令行输出?

在Linux中,虽然stdout到命令行,我想更新特定区域,如apt-get输出: 54% [Waiting for headers] [Waiting for headers] 211 kB/s 3s 百分比 , kB /秒和秒将更新每秒。 如果我们使用printf那么我们会得到多行输出。 我试过下面的printf : printf("\e[1;1H\e[2J"); 但它清除所有的输出。 我的问题是如何更新特定区域并保持其他人稳定?