Articles of c ++ 11

通过套接字发送NULL数据

我目前正试图通过基于TCP / IP的套接字与外部应用程序通信。 我已经成功build立了与客户端的连接,并收到一些数据。 这个手册在这里指出 在收到这个命令后,客户端必须从守护进程读取一个确认字节。 肯定确认是一个零位的八位位组。 否定确认是任何其他模式的八位字节。 我想发送一个积极的承认,我发送这种方式我的服务器侦听代码是从这里获得 void WriteData(std::string content) { send(newsockfd,content.c_str(),content.length(),0); } WriteData("00000000"); 我的问题是,如果我正确地发送这个数据(八位字节的零位)? 更新: 我已经阅读这篇文章,其中指出,发送只允许发送一个char *数组。 所以我不知道我怎么可以通过套接字发送一个字节。 我知道我可以做这样的事情 std::bitset<8> b1 ; // [0,0,0,0,0,0,0,0] 但我不知道如何通过套接字发送。

在您为INTEL C ++编译器(Linux)configuration的searchpath中找不到文件可执行文件

我想使用code :: blocks来debugging我的c ++代码。 我打开一个新项目并粘贴我的代码。 但是有上面的错误。 说实话,我不知道我的编译器是什么! 当我想运行我的代码时,我写道: g++ -std=gnu++11 mycodename.cpp 在terminal。 如何在Linux中删除以上错误? 一步一步的答案是高度赞赏。 我将编译器从setting…compiler更改为gnu gcc,但错误是关于英特尔编译器!

使用unique_ptr来控制文件描述符

理论上,我应该能够使用自定义的指针types和删除器,以使unique_ptrpipe理不是指针的对象。 我试了下面的代码: #ifndef UNIQUE_FD_H #define UNIQUE_FD_H #include <memory> #include <unistd.h> struct unique_fd_deleter { typedef int pointer; // Internal type is a pointer void operator()( int fd ) { close(fd); } }; typedef std::unique_ptr<int, unique_fd_deleter> unique_fd; #endif // UNIQUE_FD_H 这是行不通的(gcc 4.7和-std = c ++ 11参数)。 它回应以下错误: In file included from /usr/include/c++/4.7/memory:86:0, from test.cc:6: /usr/include/c++/4.7/bits/unique_ptr.h: In instantiation […]

如何在centos6上分发c ++ 11共享库

我有一个C ++ 11库( https://github.com/matiu2/cdnalizer )。 我想分发到centos6和ubuntu12.04 LTS。 它在Ubuntu 13.10和Gentoo上愉快地编译。 我尝试尽可能多的静态编译,但它仍然取决于centos没有的glibc: matiu@matiu-laptop:~/projects/cdnalizer/build/src/apache$ readelf -d mod_cdnalizer.so | grep NEED 0x0000000000000001 (NEEDED) Shared library: [libapr-1.so.0] 0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6] 0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000006ffffffe (VERNEED) 0xd520 0x000000006fffffff (VERNEEDNUM) 3 build造线: /usr/bin/g++ -fPIC -I/usr/local/include -I/usr/include -I/usr/include/x86_64-linux-gnu -I/usr/include/x86_64-linux-gnu/c++/4.8 -Wall -Wextra -g -shared -Wl,-soname,mod_cdnalizer.so […]

如何编写写入/ var / log / myapp目录的C / C ++应用程序?

背景 在Linux系统上, 应用程序日志存在于/var/log子目录中,该root/root由root/root拥有,在我的系统上拥有755个权限。 例如,我看到/var/log/mysql和/var/log/samba 。 题 如果我想让一个myapp能够写入/var/log/myapp ,在C / C ++中完成此操作的规范方式是什么? 思考 如果我不想sudo a_setup_script.sh我必须像setuid root那样做一些疯狂的sudo a_setup_script.sh吗? 请注意,我知道syslog例程,但它们不足以满足我的需要(我需要logging更多的信息,分成不同的文件,因此需要子目录)。 我是否需要查看一下Ubuntu打包(设置目录)和将文件IO直接导入子目录(通过myapp )? 我想尽可能遵循标准。 附录 我忘了提及, myapp实际上是一个守护进程(一个监听客户端的服务器),所以如果有一个myapp_user实际运行/启动进程,那么这个进程并不是那么糟糕。 回答 对于Ubuntu,最好的解决scheme似乎是rsyslog ,这是一个function强大,现代化的syslog替代品。 它将根据需要生成文件/目录,它具有用于灵活路由syslog条目的内置语言,并且在C / C ++级别使用简单的旧syslog API。 要存储路由信息,您可以在C / C ++中定义自己的文本消息编码,并配合正确的rsyslog.conf来处理解码。

C ++ 11:g ++ – 4.7内部编译错误

以下代码: #include <iostream> #include <array> using namespace std; constexpr int N = 1000000; constexpr int f(int x) { return x*2; } typedef array<int, N> A; template<int… i> struct F { static constexpr A f() { return A{{ ::f(i)… }}; } }; template<class A, class B> struct C {}; template<int… i, int… j> struct C<F<i…>, F<j…>> […]

为什么使用std :: thread :: hardware_concurrency()和boost :: thread :: hardware_concurrency()有区别?

问题本身的描述非常简单。 我正在testing在C + + 11和boost ::线程库的std ::线程库的差异。 这些输出: #include <iostream> #include <thread> #include <boost/thread.hpp> int main() { std::cout << std::thread::hardware_concurrency() << std::endl; std::cout << boost::thread::hardware_concurrency() << std::endl; return 0; } 给了我不同的结果: 0 4 这是为什么? PS:gcc软件包的版本是4.6.2-1.fc16(x86_64)。 我在用着 g++ test.cc -Wall -std=c++0x -lboost_thread-mt -lpthread

链接/运行时不同GCC版本的风险?

我使用的是英特尔的C ++编译器,它在Linux上依赖于GNU提供的libc.so和libstdc ++。 这是我的问题。 要访问一些最新的C ++ 11function,我需要使用GCC 4.7或更高版本附带的libstdc ++。 但我坚持使用CentOS 6.4。 在CentOS 6.4上,GCC的本地版本是4.4。 但是使用名为“SCL”的RedHat和名为“devtoolset-1.1”的软件包,我可以在“/ opt”下安装GCC 4.7。 我以上述方式设置了使用GCC 4.7,我可以使用更新的C ++ 11function。 所以这里是我的问题:如果用户运行我的程序只有libc.so / libstdc ++的GCC 4.4版本,所以在库path中,是否有风险,我的程序将有错误,由于4.4和4.7版本之间的不匹配那些图书馆? 如果有潜在的问题,我可以通过在GCC 4.7的libc和libstdc ++版本中静态链接来解决这个问题吗? 或者,如果/当我的代码dynamic加载的其他库select由系统范围的GCC 4.4包提供的较旧的libc / libstdc ++时,是否设置自己的其他问题?

Makefile c ++ 11支持

我最近用C ++开始了一个小项目。 我创build了一个简单的Makefile: CC=g++ CFLAGS =-std=c++0x -I. -c VPATH = src include vpath %.c src vpath %.h include TabooSearch : main.o Task.o TabooList.o $(CC) $(CFLAGS) -o TabooSearch main.o Task.o TabooList.o 问题是,当我运行make我得到这种错误forms的海湾合作委员会: error: 'nullptr' was not declared in this scope 我没有任何IDE我的Makefile有什么问题,有人可以帮我解决这个问题。 在Debian上,我的gcc版本是4.7.2 提前致谢

在linux上学习线程

Linux对我来说是一个新的平台。 我已经在Windows上用c ++编写了很多年,并且已经适应了该平台上的multithreading。 当我需要在Linux平台上学习c ++的时候,C ++ 11也随之而来。 Linux似乎大部分使用pthreads – 好的还有boost :: threads,QT也有自己的线程。 但是在C ++ 11中,std :: thread是一个全新的(跨平台和C ++标准)线程方式。 所以我想我将不得不学习pthreads和std :: threads。 最后,std :: thread似乎更重要,但是有很多遗留代码,所以我必须知道两者。 对于Windows上的线程同步,我将使用WaitForMultipleObjects等待一些任务完成,然后继续进一步的工作。 pthread是否存在类似的同步机制? 的std ::线程? 我看了一下pthread_join ,它似乎有一次只能在一个线程上等待的function。 我是否错过了另一个pthread调用?