Articles of c + +

如何检测Linux板上GPIO引脚的变化

我在基于ARM的Linux板(imx233 CPU)上使用3.12内核。 我的目的是检测GPIO引脚的变化(1到0)。 我可以读取不断调用下面的函数的引脚值(在while(1)循环中) int GPIO_read_value(int pin){ int gpio_value = 0; char path[35] = {'\0'}; FILE *fp; sprintf(path, "/sys/class/gpio/gpio%d/value", pin); if ((fp = fopen(path,"rb+")) == NULL){ //echo in > direction //error } fscanf(fp, "%d", &gpio_value); fclose(fp); return gpio_value; } 但是这会给CPU造成太多的负担。 我不使用nanosleep或nanosleep ,因为换针发生的时间很短,这会导致我错过这个事件。 据我所知,这是不可能使用poll() 。 是否有任何poll()函数,我可以用它来检测一个GPIO引脚变化? 编辑:以防万一,如果我做错了什么,这里是我的poll()用法,不检测引脚更改 struct pollfd pollfds; int fd; int nread, result; pollfds.fd […]

使用C ++在Linux中监视磁盘挂载的最佳方法?

我目前正在构build一个Carputer前端,它需要的一个function是能够识别何时插入外部媒体,如USB / SD记忆棒或iPod。 插入后,我将扫描设备上的音乐/video/图像,并将其添加到媒体库中。 或者,我需要知道这些设备何时被移除,以便我可以从当前可用的媒体中删除添加的项目。 我的问题是,在使用C ++的Linux环境中监视磁盘插入/删除的最佳方法是什么? 我可以监视/ media文件夹,当Linux自动挂载磁盘,但这是完成任务的最佳方式? 感谢任何见解!

for_each_process – 它是否迭代线程和进程?

我想迭代内核中的所有任务(线程和进程),并使用for_each_processmacros打印tid / pid和名称: #define for_each_process(p) \ for (p = &init_task ; (p = next_task(p)) != &init_task ; ) 我怎样才能区分线程和进程? 所以我会这样打印: if (p->real_parent->pid == NULL) printk("PROCESS: name: %s pid: %d \n",p->comm,p->pid); else printk("THREAD: name: %s tid: %d \n",p->comm,p->pid);

C Linux:全局variables位于共享库中作为单例

如果库被多个进程使用,是否可以将位于共享库(.so)中的全局variables用作单例? 例如初始值为0,进程1递增var,然后proc2递增val并打印它。 到目前为止,我的实验表明,这两个进程保持variables的副本,如果第一次递增,第二次仍然会读取0.因此,行为不像Windows DLL … 我在这里读到一篇文章,如果全局variables不是静态的(在lib中),并且在头文件中声明为extern,那么var对于所有进程都是唯一的。 但到目前为止,我还没有能够做到这一点 – var仍然是每个进程的副本。 有人可以提供这个好的解释吗? 而如何做到这一点…

如果ASLR被禁用,mmap是确定性的吗?

如果地址空间布局随机化(ASLR)被禁用,我们是否有确定性的mmap ? 通过确定性,我的意思是说,如果我用相同的input一次又一次地运行相同的应用程序,我会得到相同的地址由mmap返回? 我最感兴趣的是匿名的mmap。

当客户端丢失连接时,SignalR Owin Linux / Mono SocketException上的自主机

我正在运行非常简单的信号服务器自主通过欧文在Ubuntu的服务器14.04,单声道3.2.8。 (代码如下)。 连接/断开连接在远程Windows服务器上以及将位部署到Linux服务器时均正常工作。 但是,当一个客户端意外死亡,而不是告诉信号员他断开连接,那就是当我只在linux服务器上得到一个永无止境的SocketException。 大约30秒左右之后,Windows服务器断开客户端连接,但是linux服务器每隔10秒左右就会发出一次socketexception(也在下面)。 当运行相同的代码时,如何让linux服务器像Windows服务器一样工作,在设置超时后断开用户连接,而不是抛出socketexceptions? 服务器代码: using System; using System.Threading.Tasks; using Microsoft.AspNet.SignalR; using Owin; namespace signalrtestserver { class Program { static void Main(string[] args) { var uri = System.Configuration.ConfigurationManager.AppSettings["startup_uri"] ?? "http://*:7890"; using (Microsoft.Owin.Hosting.WebApp.Start<Startup>(uri)) { Console.WriteLine(string.Format("Server started on {0}. Press enter to close.", uri)); Console.ReadLine(); } } } class Startup { static Hub hub; public […]

如何编写写入/ 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来处理解码。

当传递参数作为编译时间常量或variables时,函数性能之间的差异

在Linux内核代码中有一个用于testing的macros(Linux版本2.6.2): #define test_bit(nr, addr) \ (__builtin_constant_p((nr)) \ ? constant_test_bit((nr), (addr)) \ : variable_test_bit((nr), (addr))) 其中constant_test_bit和variable_test_bit被定义为: static inline int constant_test_bit(int nr, const volatile unsigned long *addr ) { return ((1UL << (nr & 31)) & (addr[nr >> 5])) != 0; } static __inline__ int variable_test_bit(int nr, const volatile unsigned long *addr) { int oldbit; __asm__ __volatile__( […]

我想知道结构FILE,最新的内部成员

当我读K&R的C编程语言第176页时,我非常兴奋。 我find了struct FILE(我正在寻找)的所有成员,并且知道事情如何工作。 但猜猜,gcc抱怨,错误:'FILE'没有名为'fd'的成员。 这意味着事情现在已经改变,我Googlesearch,但无法find。 请帮助,提前谢谢。 我可以使用fileno()来获取文件描述符,但是我讨厌在抽象层面上工作。 int main ( int argc, char **argv ){ FILE *fp = fopen ("ct.c", "r"); printf ("%i", fp->fd); return 0; }

in_addr_tstring

我有一个存储在in_addr_t中的IP地址,我想创build这个数据types的string表示,即in_addr_t到10.0.0.1。 我怎样才能做到这一点?