Articles of Linux操作系统

select()不适合使用eventfd

我想使用eventfd来表示内核空间和用户空间之间的简单事件。 eventfd将用作信号的方式,实际数据将使用ioctl传输。 在继续实现这个之前,我写了一个简单的程序来看看eventfd如何与select()一起工作。 看来,如果你使用select来等待一个eventfd,当你在一个单独的线程中写入它时,它不会返回。 在我写的代码中,写入线程从程序启动开始等待5秒,然后写入到eventfd中两次。 我希望select()在写入之后立即返回到读线程中,但是这不会发生。 select()仅在10秒的超时后返回并返回零。 不pipe这个返回值为零,当我尝试在10秒后读取eventfd时,我会得到正确的值。 我使用Ubuntu 12.04.1(3.2.0-29-generic-pae)i386 任何想法,为什么这样呢? 在我看来,select()不工作,因为它应该。 PS:这个问题类似于linux – 不能让eventfd和epoll一起工作 有没有人面临类似的问题? #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <stdint.h> //Definition of uint64_t #include <pthread.h> //One thread writes to fd, other waits on it and then reads it #include <time.h> //Writing thread uses delay before writing #include <sys/eventfd.h> int efd; //Event […]

我将如何将多个目录压平并叠加到一个目录中?

我想获取一个目录层次结构的列表,并将它们拼合成一个单独的目录。 稍后在列表中的任何重复文件将replace较早的文件。 例如… foo/This/That.pm bar/This/That.pm bar/Some/Module.pm wiff/This/That.pm wiff/A/Thing/Here.pm 这将结束 This/That.pm # from wiff/ Some/Module.pm # from bar/ A/Thing/Here.pm # from wiff/ 我有一个可能复杂的Perl程序来做到这一点。 我对用户可能解决它的聪明方式感兴趣。 大的障碍是“根据需要创build中间目录”,也许有一些basename和dirname的组合。 我正在解决的真正的问题是检查两个安装的Perl库之间的区别。 我首先将每个Perl的多个库目录展平成一个目录,模拟Perl如何search一个模块。 然后我可以把它们分开。

rsync更改文件到不同的目录

我正在尝试从远程到本地rsync,并将所有更改的文件放到不同的目录。 例如,在遥控盒中, /tmp -file1.txt -file2.txt -file3.txt 在我的地方 /tmp -file1.txt -file2.txt /new 如果我做一个rsync,我的本地将是 /tmp -file1.txt -file2.txt -file3.txt /new -file3.txt 我怎样才能做到这一点?

为什么我不能用std = c99声明sigset_t?

如果我编译下面的程序std = c99,我得到一个错误,但程序编译罚款没有c99标志。 为什么? #include <signal.h> void x() { sigset_t dd; } int main(void) { x(); return 0; } jim@cola temp]$ gcc -std=c99 blah.c -o blah blah.c: In function 'x': blah.c:9: error: 'sigset_t' undeclared (first use in this function) blah.c:9: error: (Each undeclared identifier is reported only once blah.c:9: error: for each function it appears […]

我怎样才能取代在Linux中的特定文件夹中find的所有电子邮件地址

我在一些文件夹中有一些脚本。 像/var/www/sites 现在我想要replace所有文件夹和子文件夹中的脚本中硬编码的所有电子邮件地址,并replace为我的电子邮件地址 我怎样才能做到这一点。 我可以find使用 grep -rn "abc@gmail.com" /var/www/sites/ 但我不知道如何使用正则expression式和replace

在shell脚本中修改导出的variables

我有一个shell脚本,看起来像下面的代码片段: … export updates=0 processFiles() { updates=$((updates+1)) } export -f processFiles find $path -exec /bin/bash -c "processFiles '{}'" \; echo $updates 用来计算更新,插入和文件的数量。 不幸的是,最后的回声总是打印0。 我已经尝试在函数中使用导出 – 没有工作。

从编译的文件(linux)获取所有全局variables。 如何从静态分离const?

所以,我在这里有一些奇怪的东西。 例如,我有2个.cpp文件,其中一个包含 const std::string DICTIONARY_DEFAULT = "blah"; const std::string ADDTODICTIONARY_DEFAULT = "blah"; const std::string BUTTONS = "blah"; 和第二个一起 static int x1; static int NewY1, NewY2, NewX1, NewX2; 这两个片段都在全局variables部分。 我需要打印全局静态variables(例如),但忽略常量。 在nm输出中,它们看起来完全相同(每种情况都是b型,这意味着未初始化的本地范围符号)。 有没有办法自动分开这些情况下使用只有Linux实用程序(grep,正则expression式等是完全没关系)?

如何使用像`GtkAttachOptions“枚举types设置小部件属性? 我试图模拟`gtk_widget_set_vexpand`在`gtk2`上工作

我的项目是创build一个graphics应用程序来帮助每个员工在中央数据库中创build自己的客户列表,唯一的问题是gtk3和gtk2之间的兼容性。 该项目始终是基于gtk3 ,然后我意识到有员工只使用gtk2的系统。 所以我对这个实现进行了一些修改,没有什么问题。 我想完成的最后一件事就是模拟gtk_widget_get_hexpand()和gtk_widget_get_vexpand()的函数……它们只在gtk3 。 对于其他function工作方式与gtk3相同,我做了这样的事情: #define gtk_grid_new() gtk_table_new(1,1,false) #define GTK_GRID(x) GTK_TABLE(x) #define GtkGrid GtkTable #define gtk_grid_attach(x1,x2,x3,x4,x5,x6) gtk_table_attach(x1,x2,x3,x3+x5,x4,x4+x6,GTK_FILL,GTK_FILL,0,0) 要让应用程序在没有gtk_widget_get_hexpand()和gtk_widget_get_hexpand()函数的情况下工作,只需: #define gtk_widget_set_hexpand(x1,x2) #define gtk_widget_set_vexpand(x1,x2) 因为用macros来模拟这些函数稍微复杂一些,我试图做这样的事情: inline void gtk_widget_set_hexpand(GtkWidget* widget,gboolean expanded) { GValue value = G_VALUE_INIT; g_value_init(&value,G_TYPE_ENUM); if(expanded) g_value_set_enum(&value,GTK_EXPAND); else g_value_set_enum(&value,GTK_FILL); gtk_container_child_set_property(GTK_CONTAINER(gtk_widget_get_parent(widget)),widget,"x-options",&value); } inline void gtk_widget_set_vexpand(GtkWidget* widget,gboolean expanded) { GValue value = G_VALUE_INIT; g_value_init(&value,G_TYPE_ENUM); if(expanded) g_value_set_enum(&value,GTK_EXPAND); […]

Linux DMA操作 – 如何启动传输

我已经阅读了Linux设备驱动程序LDD3 ,DMA-API.txt,DMA-HOWTO.txt也查看了驱动程序/ dma / dmatest.c,但我无法弄清楚如何启动dma传输。 所有关于映射内存的讨论都没有讨论如何启动事务。 PCI示例驱动程序具有传输function,但它使用“特定的”DMA操作,我试图找出一个更通用的/可移植的实现,而不是硬件依赖 我正在尝试做类似的事情 dma_map_single() 启动读/写事务 中断该事务已完成,使用处理程序或wait_event_freezable_timeout dma_unmap_single() 我只是读/写我映射的内存? 我如何注册callback处理程序? 编辑:给一点更多的细节,我在ARM平台上工作。

交叉编译一个驱动程序写在C为linux不配备configuration文件

我们正在尝试为TP-Link TG 3468千兆以太网适配器交叉编译驱动程序。 该供应商有一个Linux版本的驱动程序,但没有configuration文件存在。 只有make文件和c文件。 请提供一种交叉编译驱动程序的方法。 我们正在尝试为基于ARM处理器的单板计算机进行编译。