如何在没有轮询的情况下查找文件中的更改?

时间:2014-10-08 19:58:32

标签: c beagleboneblack

我有一个beagle骨头,想从我的程序中读取gpio引脚。该文件在任何给定时刻都包含1或0。在我的C程序中,我有一个while循环,它通过sleep函数永远运行,以防止它在每次引脚为低(0)时为cpu hog,当它为高时(1)它运行代码。我觉得这非常浪费资源。当这个文件是1然后运行代码时,有没有办法可以看到?我不喜欢轮询,特别是当比格犬骨头将由电池供电时。

1 个答案:

答案 0 :(得分:0)

使用通知机制,例如使用libev

基本思想是,如果数据可用,则调用回调。

如果这不起作用,您可能需要使用其他API来实现,例如inotify。

示例由libev docs提供:

// a single header file is required
#include <ev.h>

#include <stdio.h> // for puts

// every watcher type has its own typedef'd struct
// with the name ev_TYPE
ev_io stdin_watcher;
ev_timer timeout_watcher;

// all watcher callbacks have a similar signature
// this callback is called when data is readable on stdin
static void
stdin_cb (EV_P_ ev_io *w, int revents)
{
 puts ("stdin ready");
 // for one-shot events, one must manually stop the watcher
 // with its corresponding stop function.
 ev_io_stop (EV_A_ w);

 // this causes all nested ev_run's to stop iterating
 ev_break (EV_A_ EVBREAK_ALL);
}

// another callback, this time for a time-out
static void
timeout_cb (EV_P_ ev_timer *w, int revents)
{
 puts ("timeout");
 // this causes the innermost ev_run to stop iterating
 ev_break (EV_A_ EVBREAK_ONE);
}

int
main (void)
{
 // use the default event loop unless you have special needs
 struct ev_loop *loop = EV_DEFAULT;

 // initialise an io watcher, then start it
 // this one will watch for stdin to become readable
 ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ);
 ev_io_start (loop, &stdin_watcher);

 // initialise a timer watcher, then start it
 // simple non-repeating 5.5 second timeout
 ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);
 ev_timer_start (loop, &timeout_watcher);

 // now wait for events to arrive
 ev_run (loop, 0);

 // break was called, so exit
 return 0;
}