Articles of c + +

同时访问文件。 奇怪的locking行为

我无法理解我的程序行为。 int MyOpenWrite(char *name,int flags) { int fd; unsigned long tm; unsigned long t; tm=time(0)+5; //5 seconds for (;;) { fd = open(name,flags,S_IREAD|S_IWRITE|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); if (fd>0) break; if (time(0)>=tm) return -1; } //1111111111111111111 LockFile(fd); DelayInSeconds(60); //2222222222222222222222 return fd; } int LockFile(int fd) //return 0 – OK; -1 – Error { struct flock lock; lock.l_type = F_WRLCK; […]

计数程序的系统调用,并用strace检查结果的有效性

我正在使用ptrace来计算程序的系统调用。 问题是给定一个程序A,我的程序打印出系统调用的数量(打开,closures,读取,写入)。 我的程序和strace(带-c选项)的结果与程序A的参数是一样的,除了开放的系统调用。 我的程序打印15和strace打印3。 但是我猜测,strace也打印了一些其他的系统调用,这些可能总结为我的程序计算的15个开放系统调用。 我在查看ORIG_EAX / RAX寄存器时使用SYS_open来检查ptrace的结果。 strace打印的系统调用在这里。 更新: 我从terminal编译我的程序并从那里运行,结果与strace相同。 我正在开发netbeans。 为什么会发生?

如何处理与Git的这个补丁问题?

我目前正在使用git的项目。 基本上,我的git树由三个分支组成: 分行 – 答 :原产地分支,从中派生我的工作。 分支B :基于A的分支。 B包含开发工作( A的新function)。 分支C :由于时间pipe理的原因,我也开始为新function开发不完整的实验选项。 这个实验代码直接添加到B中 。 所以C是B的清理分支,只保留完全可操作的代码。 分支关系可以用这种方式来表示: 一个 头 – > B – > 提交0 – > … – > 提交n – > C – > 清理提交 分支B包含所有新特征的代码,有时还混合有正在开发中的可选分段。 C中的所有提交都删除了实验部分。 分支C中的代码是干净的,我想从中伪造一个补丁。 补丁应该包括从C的最后一次提交到A的所有更改。 如果我做了git format-patch master –stdout > my_patch.patch ,就会产生一个补丁,这个补丁会在操作代码中有效地结束。 但是这样做不好,因为在补丁中,实验代码被添加(通过B中的一些提交),然后被删除(清理C中的提交)。 除了不聪明之外,这还包括无用的额外空间(这意味着额外的邮件与社区共享补丁)以及额外的应用程序开销。 我应该如何操作这些分支来产生干净的补丁? 请注意,我想保留到目前为止在分支B所做的实验工作,我只是不想将其包含在补丁中。

getenv函数不返回预期的答案

我试图访问我的environementvariables之一,这是JAVA_HOME 。 为此,我使用getenv()函数,如下所示: #include <iostream> #include <string.h> int main() { const char* env = getenv("JAVA_HOME"); if(env != NULL) std::cout << "Environnement : " << env << std::endl; else std::cout << "NULL" << std::endl; return 0; } 我tryed std::getenv("PATH"); 这会返回一些与我的文件/etc/bash.bashrc不同的地方,在这里我放置了我的JAVA_HOMEvariables。 我期望std::getenv("JAVA_HOME")返回我放在我的/etc/bash.bashrc文件。 现在它返回不同的东西。 我怎样才能得到一个正确的environementvariables? 我究竟做错了什么 ? 我在Ubuntu 12.04下使用C ++ 11与QtCreator进行GCC 4.7.2 编辑:代码 包括是包含的简写 增加了NULL处理 编辑:进展 我试过extern char […]

吞吐量的变化,吞吐量从4k降到9

我有一个networking客户端和服务器应用程序。 数据stream是这样的:客户端向服务器发送消息,服务器以确认响应。 只有在收到确认的情况下,客户端才能看到下一条消息。 用C ++编写的客户端应用程序有3个线程,即networking线程(负责通过套接字发送消息),主线程(负责发出请求消息)和计时器线程(每秒触发一次)。 服务器应用程序有2个线程,主线程和networking线程。 我运行RHEL 6.3,2.6.32-279内核。 configuration1 tuned-admconfiguration文件延迟性能 所有客户端的线程在相同的CPU核心ID上 所有服务器的线程在相同的CPU Core ID上,但与客户端线程不同 客户端和服务器在同一台机器上运行 吞吐量:每秒4500条消息 configuration2 tuned-admconfiguration文件吞吐量性能 所有客户端的线程在相同的CPU核心ID上 所有服务器的线程在相同的CPU Core ID上,但与客户端线程不同 客户端和服务器在同一台机器上运行 吞吐量:每秒9-15条消息 configuration3 tuned-admconfiguration文件吞吐量性能 所有客户端的线程在不同的CPU核心ID上 所有服务器的线程在不同的CPU核心ID上,以及来自客户线程的不同的核心ID 客户端和服务器在同一台机器上运行 吞吐量:每秒1100条消息 机器的负载可以忽略不计。 当configuration文件从延迟性能切换到吞吐量性能时,有人可以解释每秒从4k降低到9个消息的情况吗?

在Linux中写入命名pipe道的最好,最安全的方法是什么?

在Linux中写入命名pipe道的最好,最安全的方法是什么? 或者,我怎样才能使命名pipe道安全? 以下是我如何使用PHP写入到Linux上的pipe道: $con = fopen("/tmp/myFIFO", "w"); fwrite($con, "UP\n"); fclose($con); 我希望使它更安全。 这是我如何创build在C: int pc; char mode[] = "0777"; int i = strtol(mode, 0, 8); pc = mkfifo(FIFO, 0); if(pc < 0) { printf("Failed in creating a pipe\n"); printf("Exiting…\n"); exit(1); } else { printf("Success in Creating Pipe\n"); chmod("/tmp/myFIFO", i); }

加载graphics内容的线程

我正在创造游戏引擎。 在Windows上,我有两个线程共享两个上下文(使用wglShareLists)。 它工作正常。 当一个线程加载资源时,其他的只是渲染简单的加载屏幕。 在Linux上没有WGL,只有glX。 我不知道如何正确使用它。 目前我的线程代码如下所示: LinuxThread::LinuxThread() : handle_(0), running_(false), task_(0), useGraphicsContext_(0), threadContext_(0), threadDrawable_(0), dsp_(0) { } LinuxThread::~LinuxThread() { finishTask(); running_ = false; glXDestroyContext(dsp_, threadContext_); } ULONG LinuxThread::getId() { return static_cast<ULONG>(handle_); } void LinuxThread::start() { running_ = true; pthread_create(&handle_, 0, &LinuxThread::staticRun, (void*) this); } bool LinuxThread::isRunning() { return running_; } void LinuxThread::setGraphicsContext(bool state) { […]

从NTP服务器传递时间信息到strftime函数

我通过引用这里的网页在底部使用代码ntp客户端代码。 代码接收时间信息,然后我想存储的时间信息为YYYYMMDDHHMM像201304211405 。 代码接收来自NTP服务器的时间信息,但是我发现如何将该信息传递给strftime ,我该如何将收到的时间信息传递给strftime ? 这是代码的相关部分 i=recv(s,buf,sizeof(buf),0); tmit=ntohl((time_t)buf[10]); //# get transmit time tmit-= 2208988800U; printf("tmit=%d\n",tmit); //#compare to system time printf("Time is time: %s",ctime(&tmit)); char buffer[13]; struct tm * timeinfo; timeinfo = ctime(&tmit); strftime (buffer,13,"%04Y%02m%02d%02k%02M",timeinfo); printf("new buffer:%s\n" ,buffer); 这里是我正在使用的完整代码 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> void ntpdate(); int main() […]

强制内存分配在64位Linux上从更高地址(> 4GB)分配

这里是我想要做的:我有一个为64位Linux构build的库。 然后我创build了一个链接该库的应用程序。 我想确保在运行应用程序时,从库中分配的内存始终位于较高的位置(> 4GB)。 在Windows上,用户可以强制分配以便在testing之前从较低地址分配较高地址,在调用VirtualAlloc时指定MEM_TOP_DOWN或将以下registry值设置为0x100000: HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Memory Management \ AllocationPreference 我不知道在Linux上是否有类似的策略。 我了解Linux内存pipe理与Window不同,但是我发现了一些线索,例如使用mmap()或者链接器脚本。 但是我一直无法实现这个目标。 任何人都可以提供更多的信息? #include <sys/mman.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) int main() { void *addr1=0, *addr2=0; long sz = sysconf(_SC_PAGE_SIZE); // get page […]

PACKET_TX_RING只发送第一个数据包,然后不再做任何事情

我有以下代码: #ifndef RAWSOCKET_H #define RAWSOCKET_H #include <stdio.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <stdint.h> #include <unistd.h> #include <assert.h> #include <errno.h> #include <fcntl.h> #include <poll.h> #include <arpa/inet.h> #include <netinet/if_ether.h> #include <sys/mman.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <sys/stat.h> #include <linux/if.h> #include <linux/if_packet.h> #include "IPPacket.h" #define CONF_RING_FRAMES 128 /// Initialize a packet socket ring buffer // @param […]