Articles of c + +

如何为使用LDAP的用户进行密码validation?

我正在编写一个客户端应用程序(使用OpenLDAP库),用户通过LDAP服务器进行身份validation。 下面是示例,硬编码,无法比较userPassword为用户的程序。 #include <stdio.h> #include <ldap.h> #define LDAP_SERVER "ldap://192.168.1.95:389" int main( int argc, char **argv ){ LDAP *ld; int rc; char bind_dn[100]; LDAPMessage *result, *e; char *dn; int has_value; sprintf( bind_dn, "cn=%s,dc=ashwin,dc=com", "manager" ); printf( "Connecting as %s…\n", bind_dn ); if( ldap_initialize( &ld, LDAP_SERVER ) ) { perror( "ldap_initialize" ); return( 1 ); } rc […]

close()在Linux上调用fsync()吗?

当我们调用close(<fd>) ,它是否自动执行fsync()以同步到物理介质?

Linux / x86-64系统调用中的结构体对于汇编程序员的布局?

许多linux / x86-64系统调用接受指向结构的指针作为参数。 例如stat(2)的第二个参数是struct stat* … struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; […]

跨平台浮点一致性

我正在开发一个使用锁步模型在networking上播放的跨平台游戏。 作为一个简要的概述,这意味着只有input被传送,所有的游戏逻辑都在每个客户端的计算机上被模拟。 因此,一致性和决定论是非常重要的。 我正在编译使用GCC 4.8.1的MinGW32上的Windows版本,在Linux上我使用GCC 4.8.2编译。 最近让我感到震惊的是,当我的Linux版本连接到我的Windows版本时,即使在两台机器上都编译了相同的代码,程序也会立即发散或者解除同步! 原来问题是Linux版本是通过64位编译的,而Windows版本是32位的。 编译Linux 32位版本后,我很高兴地解决了这个问题。 然而,这让我思考和研究浮点确定性。 这是我所收集的: 一个程序通常是一致的,如果是: 跑在同一架构上 使用相同的编译器编译 所以如果我假设,针对个人电脑市场,每个人都有一个x86处理器,那么解决了要求之一。 但是,第二个要求似乎有点愚蠢。 MinGW,GCC和Clang(分别是Windows,Linux,Mac)都是基于/兼容GCC的不同编译器。 这是否意味着实现跨平台决定论是不可能的? 还是只适用于Visual C ++ vs GCC? 同样,优化标志-O1或-O2是否会影响这种确定性? 离开他们会更安全吗? 最后,我有三个问题要问: 1)在编译器中使用MinGW,GCC和Clang时,是否可以实现跨平台的确定性? 2)这些编译器应该设置哪些标记以确保操作系统/ CPU之间的最一致性? 3)浮点精度对我来说并不重要,重要的是它们是一致的。 有没有办法把浮点数降低到一个较低的精度(比如3-4位小数),以确保系统间的小舍入误差不存在? (到目前为止我尝试写的每个实现都失败了) 编辑:我做了一些跨平台的实验。 使用漂浮点的速度和位置,我保持一个Linux英特尔笔记本电脑和一个Windows AMD桌面计算机同步浮点值的小数点后15位。 但是这两个系统都是x86_64。 testing很简单 – 只是通过networking移动实体,试图确定任何可见的错误。 如果x86计算机连接到x86_64计算机,那么假设相同的结果是有效的呢? (32位与64位操作系统)

sysconf(_SC_CLK_TCK)它返回什么?

我想了解各种sysconfmacros。我已经写了一个程序如下。 int main() { fprintf(stdout, "No. of clock ticks per sec : %ld\n",sysconf(_SC_CLK_TCK)); return 0; } 我总是得到100的结果。我正在运行在时钟为2.93GHz的CPU上。数字100的意思是什么?

如何在Linux中使用C ++获取硬件信息

我需要在Win和* nix机器上获得硬盘的规格。 我在Linux上使用<hdreg.h> ,如下所示: static struct hd_driveid hd; int device; if ((device = open("/dev/sda", O_RDONLY | O_NONBLOCK)) < 0) { cerr << "ERROR: Cannot open device /dev/sda \n"; exit(1); } if (!ioctl(device, HDIO_GET_IDENTITY, &hd)) { cout << hd.model << endl; cout << hd.serial_no << endl; cout << hd.heads << endl; } 我需要hd_driveid来告诉我一些关于磁盘的更多信息。 我想知道: 分区数量 每个分区的规格(格式,标签,标志,大小,起始点,轨道数量等) […]

Linux设备驱动程序中的静态函数?

linux代码中的设备驱动程序中的大多数函数定义是否被定义为静态是有原因的吗? 是否有一个原因? 我被告知这是为了范围界定和防止命名空间污染,任何人都可以详细解释为什么静态定义在这种情况下使用?

如何衡量目前在Linux上使用的内存带宽?

我正在编写一个小型Linux应用程序,logging计算机的功耗以及CPU利用率和磁盘利用率。 我想添加logging当前正在使用的内存带宽的能力,所以我可以看到与功耗相关性如何。 我知道我可以从/proc/meminfo获得当前分配的内存量的信息,但当然,这并不能告诉我目前有多less带宽正在使用。 有谁知道我怎么可以测量目前使用的内存带宽? 编辑我想这主要在x86和x86-64平台上工作

带recv-timeout的套接字:这段代码有什么问题?

我试图实现一个接收超时1秒的套接字: int sockfd; struct sockaddr_in self; struct sockaddr_in client_addr; int addrlen=sizeof(client_addr); ssize_t nBytes; sockfd = socket(AF_INET, SOCK_STREAM, 0); self.sin_family = AF_INET; self.sin_port = htons(PORT); self.sin_addr.s_addr = INADDR_ANY; int on = 1; setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on); // 1 Sec Timeout tv.tv_sec = 1; tv.tv_usec = 0; setsockopt( sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv); bind(sockfd, (struct […]

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…>> […]