标签: linux

如何在没有X11或/ dev/fb0的Linux下拍摄屏幕截图?

我正在研究基于Linux的嵌入式系统.它使用Qt进行窗口化,没有Xserver.我的目标是拍摄屏幕截图.

我尝试过使用FBgrab.它失败了,因为我没有,/dev/fb0因为内核中没有启用帧缓冲区.我们正在运行基于Qt的应用程序以在屏幕上显示UI(HDMI).我也在QT网站上尝试了使用QPixmap和抓取窗口的屏幕截图应用程序.这也是一个失败,因为我无法在系统中运行两个QAppliction,因为它会影响显示.

有没有其他方法来拍摄屏幕?

c++ linux embedded qt directfb

8
推荐指数
1
解决办法
1640
查看次数

在构建gcc-4.8.2时如何理解这些可怕的错误?

我试图在远程Debian 7系统上安装gcc-4.8.2编译器,我没有root权限,但只有ssh访问权限.我发现最简单的方法是从源代码编译编译器.

我正在从GCC网页上关注这个简短的安装手册.

基本上我做了最简单的安装,总结在页面底部:

tar xzf gcc-4.8.2.tar.gz
cd gcc-4.8.2
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
$PWD/../gcc-4.8.2/configure --prefix=$HOME/gcc-4.8.2 --enable-languages=c++
make
Run Code Online (Sandbox Code Playgroud)

除了./contrib/download_prerequisites防火墙限制,我没有在远程计算机上运行脚本.相反,我在我的本地机器上运行它,然后将整个文件夹压缩回来gcc-4.8.2.tar.gz并将其scp到远程机器.在那里,我重新创建了前提库(gmp,...)的符号链接并运行make.几秒钟后,我收到了不可思议的错误:

In file included from ./tm.h:19:0,
                 from ../../gcc-4.8.2/gcc/c/c-lang.c:24:
./options.h:4078:2: error: #error too many masks for ix86_isa_flags
In file included from ../../gcc-4.8.2/gcc/tree.h:26:0,
                 from ../../gcc-4.8.2/gcc/c/c-lang.c:25:
../../gcc-4.8.2/gcc/statistics.h:25:2: error: #error GATHER_STATISTICS must be defined
In file included from ../../gcc-4.8.2/gcc/system.h:268:0,
                 from ../../gcc-4.8.2/gcc/c/c-lang.c:22:
../../gcc-4.8.2/gcc/hwint.h:16:39: …
Run Code Online (Sandbox Code Playgroud)

c++ linux installation gcc

8
推荐指数
1
解决办法
3544
查看次数

Linux fork函数与Windows的CreateProcess相比 - 什么被复制?

我正在将Windows应用程序移植到Linux.我CreateProcess在Windows上使用它来运行子进程并重定向所有标准流(in,out,error).流重定向很关键,主进程将数据发送给子进程并接收他们的输出和错误消息.主进程非常大,具有大量内存和线程,子进程是小进程.在Linux上,我看到该fork功能具有与CreateProcessWindows 类似的功能.但是,手动说fork"创建父进程副本",包括代码,数据和堆栈.这是否意味着如果我创建一个使用1 GB内存的巨大进程的副本只是为了运行一个使用1 MB内存的非常简单的命令行工具,我将需要与之重复1 GB的内存fork,然后替换这个1 GB的1 MB进程?那么,如果我有100个线程,它将需要100 GB的内存来运行100个需要100 MB内存才能运行的进程?另外,父进程中的其他线程"执行"不知道fork,他们会做什么?什么fork功能"引擎盖下",是否是从巨大的父母创建大量小子进程真正有效的方法?

c c++ linux fork

8
推荐指数
1
解决办法
3389
查看次数

为什么Java内存映射缓冲区会导致大量意外的磁盘IO?

我编写了一些使用映射文件缓冲区的Posix程序.一个简单的场景是将1GB文件映射到内存中,并用内容填充整个文件.

在程序执行期间,直到msyncmunmap调用发生时几乎没有磁盘IO .

在完全相同的系统上,我写下了在Oracle JDK 7上运行的Java中的等效程序,并注意到整个程序执行过程中的大量磁盘IO活动.

内存映射文件缓冲区在JVM中的实现方式有何不同?反正有没有推迟大规模的IO活动?

操作系统是Linux 3.2 x64.

码:

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class Main {
public static void main(String[] args) throws Exception {
    long size = 1024 * 1048576;
    RandomAccessFile raf= new RandomAccessFile("mmap1g", "rw");
    FileChannel fc = raf.getChannel();
    MappedByteBuffer buf = fc.map(FileChannel.MapMode.READ_WRITE, 0, size);
    for(long i = 0; i < size; ++i)
        buf.put((byte)1);
}
}
Run Code Online (Sandbox Code Playgroud)

java linux memory performance file-io

8
推荐指数
1
解决办法
1383
查看次数

AWS的站点到站点OpenSWAN VPN隧道问题

我们在两个AWS区域和我们的colo工具之间有一个带有Openswan的VPN隧道(使用AWS的指南:http://aws.amazon.com/articles/5472675506466066).常规使用工作正常(ssh等),但我们在所有区域之间的隧道上遇到了一些MySQL问题.在Linux服务器上使用mysql命令行客户端并尝试使用MySQL Connector J进行连接它基本上会停止...它似乎打开了连接,但随后被卡住了.它不会被拒绝或任何东西,只是挂在那里.

在最初的研究认为这是一个MTU问题,但我已经搞砸了很多,没有运气.

与服务器的连接工作正常,我们可以选择要使用的数据库等,但是使用Java连接器后,看起来Java客户端在进行查询后没有收到任何网络流量.

当在linux上的MySQL客户端中运行select时,我们可以在它死之前获得最多2或3行.

有了这个说法,我还在AWS端有一个单独的openswan VPN,用于客户端(mac和iOS)vpn连接.一切都通过客户端VPN很好地工作,一般看起来更稳定.我注意到的主要区别是静态连接使用"隧道"作为类型,客户端使用"传输",但是当将静态隧道连接切换到传输时,它说有30个打开的连接并且不起作用.

我对OpenSWAN很新,所以希望有人可以帮我指出让静态隧道正常工作以及客户端VPN的正确方向.

一如既往,这是我的配置文件:

用于BOTH静态隧道服务器的ipsec.conf:

# basic configuration
config setup
# Debug-logging controls:  "none" for (almost) none, "all" for lots.
# klipsdebug=none
# plutodebug="control parsing"
# For Red Hat Enterprise Linux and Fedora, leave protostack=netkey
protostack=netkey
nat_traversal=yes
virtual_private=
oe=off
# Enable this if you see "failed to find any available worker"
# nhelpers=0

#You may put your configuration (.conf) file in the "/etc/ipsec.d/" and uncomment this.
include /etc/ipsec.d/*.conf
Run Code Online (Sandbox Code Playgroud)

VPC1-to-colo tunnel …

mysql linux vpn ipsec amazon-web-services

8
推荐指数
1
解决办法
5589
查看次数

X11 - 在叠加窗口上绘制

我想在屏幕上的特定像素处绘制简单的图元(类似于这个问题).为了做到这一点,我使用窗口管理器的叠加窗口绘制所有窗口的顶部.我可以看到我正在绘制的形状和鼠标事件通过,但我没有看到例如窗口移动位于叠加窗口下方(除非我杀死我的应用程序).我是Xlib编程的新手,sry可能会问一个简单的问题.

#include <assert.h>
#include <stdio.h>
#include <X11/Xlib.h>

#include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xfixes.h>
#include <X11/extensions/shape.h>

#include <cairo.h>
#include <cairo-xlib.h>

Display *d;
Window overlay;
Window root;
int width, height;

void
allow_input_passthrough (Window w)
{
    XserverRegion region = XFixesCreateRegion (d, NULL, 0);

    XFixesSetWindowShapeRegion (d, w, ShapeBounding, 0, 0, 0);
    XFixesSetWindowShapeRegion (d, w, ShapeInput, 0, 0, region);

    XFixesDestroyRegion (d, region);
}

void
prep_overlay (void)
{
    overlay = XCompositeGetOverlayWindow (d, root);
    allow_input_passthrough (overlay);
}

void draw(cairo_t *cr) {
    int quarter_w = width / 4; …
Run Code Online (Sandbox Code Playgroud)

c linux x11

8
推荐指数
2
解决办法
5418
查看次数

我如何处理vim的交换文件系统?

vim在ubuntu中使用的时候,我不小心按了ctrl-z哪个暂停了我的会话vim.我正在编辑一个test未保存的文件(我称之为).

当我再次打开文件时vim,我得到了交换文件错误:

E325: ATTENTION
Found a swap file by the name ".test.swp"


Swap file ".test.swp" already exists!
Run Code Online (Sandbox Code Playgroud)

根据名称问题找到一个交换文件,我有两个选择:

  1. 找到会话并完成它(最好).
  2. 删除.swp文件(如果你确定其他git会话已经消失).

我该怎么办?如果我执行rm test.swp它没有看到文件:

rm: cannot remove `test.swp': No such file or directory
Run Code Online (Sandbox Code Playgroud)

在删除交换文件时我做错了什么?如何完成会话?


编辑:我忘记了句号test.swp 因此删除swp文件的正确方法是rm .test.swp.

我剩下的问题是如何恢复/完成暂停会议vim.

unix linux vim bash terminal

8
推荐指数
2
解决办法
2万
查看次数

FindBugs找不到org.apache.bcel.classfile.ClassFormatException

我安装了Fedora 20 findbugs RPMs,并设置了我的Ant build.xml文件:

<property name="findbugs.home" location="/usr/share/findbugs"/>

<target name="findbugs" description="static bytecode analysis">
    <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask">
    </taskdef>

    <findbugs home="${findbugs.home}" output="xml" outputFile="bcel-fb.xml">
        <sourcePath path="${src.dir}"/>
        <fileset dir="${build.dir}">
            <include name="**/*.class"/>
        </fileset>
    </findbugs>
</target>
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

java.lang.IllegalArgumentException:在/ usr/share/findbugs/lib中找不到findbugs.jar

所以我在生活的地方建立/usr/share/findbugs/lib了一个象征性的联系.这让我更进一步,但现在它吐了出来:/usr/share/javafindbugs.jar

findbugs:
 [findbugs] Executing findbugs from ant task
 [findbugs] Running FindBugs...
 [findbugs] Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/bcel/classfile/ClassFormatException
Run Code Online (Sandbox Code Playgroud)

strace显示它已找到并打开/usr/share/java/findbugs-bcel.jar,所以我不知道为什么它无法加载该类.显式添加/usr/share/java/findbugs-bcel.jar到taskdef的类路径不会改变任何东西.

注意:我不是想在BCEL上运行FindBugs.FindBugs使用BCEL进行分析,我自己的代码根本不使用BCEL.

java linux ant findbugs fedora

8
推荐指数
1
解决办法
2656
查看次数

如何与shm_open共享现有内存?

在Linux中,我想与其他进程共享我的进程的一些内存内容.其中一种方法是使用shm_open和mmap.如下.

/* Create a new memory object */
fd = shm_open( "/bolts", O_RDWR | O_CREAT, 0777 );
if( fd == -1 ) {
    fprintf( stderr, "Open failed:%s\n",
        strerror( errno ) );
    return EXIT_FAILURE;
}

/* Set the memory object's size */
if( ftruncate( fd, sizeof( *addr ) ) == -1 ) {
    fprintf( stderr, "ftruncate: %s\n",
        strerror( errno ) );
    return EXIT_FAILURE;
}

/* Map the memory object */
addr = mmap( 0, sizeof( *addr ),
        PROT_READ | PROT_WRITE,
        MAP_SHARED, …
Run Code Online (Sandbox Code Playgroud)

c linux shared-memory

8
推荐指数
1
解决办法
1037
查看次数

epoll IO与C中的工作线程

我正在编写一个小型服务器,它将从多个来源接收数据并处理这些数据.收到的消息来源和数据非常重要,但epoll应该能够很好地处理.但是,必须解析所有接收到的数据并运行大量的测试,这些测试非常耗时,并且尽管进行了epoll多路复用,仍会阻塞单个线程.基本上,模式应该如下所示:IO循环接收数据并将其捆绑到作业中,发送到池中可用的第一个线程,捆绑由作业处理,结果传递到IO循环写入文件.

我决定选择一个IO线程和N个工作线程.使用以下示例提供的用于接受tcp连接和读取数据的IO线程很容易实现:http: //linux.die.net/man/7/epoll

线程通常也很容易处理,但我正在努力将epoll IO循环与线程池以优雅的方式结合起来.我无法找到任何与在线工作池使用epoll的"最佳实践",但有关同一主题的相关问题.

因此,我有一些问题,希望有人能帮我回答:

  1. 可以(并且应该)使用eventfd作为IO线程和所有工作者之间双向同步的机制吗?例如,每个工作线程是否有一个好主意让自己的epoll例程等待共享的eventfd(带有结构指针,包含有关作业的数据/信息),即以某种方式使用eventfd作为作业队列?也许还有另一个eventfd将结果从多个工作线程传递回IO线程?
  2. 在IO线程上发出关于套接字的更多数据的信号之后,实际的recv应该发生在IO线程上,还是工作者应该自己重新获取数据,以便在解析数据帧时不阻塞IO线程等?在这种情况下,我如何确保安全性,例如,如果recv在工作线程中读取1,5帧数据而另一个工作线程从同一连接接收最后0.5帧数据?
  3. 如果工作线程池是通过互斥锁等实现的,如果N + 1个线程试图使用相同的锁,那么等待锁会阻塞IO线程吗?
  4. 对于如何使用双向通信(即从IO到工作者和返回)在epoll周围构建工作线程池,是否有任何良好的实践模式?

编辑:一种可能的解决方案是从IO循环更新环形缓冲区,更新后通过所有工作人员的共享管道将环形缓冲区索引发送给工作者(从而将该索引的控制权交给第一个读取该索引的工作人员关闭管道索引),让工人拥有该索引直到处理结束,然后再通过管道将索引号发送回IO线程,从而给予回控制?

我的应用程序仅限Linux,因此我可以使用仅限Linux的功能,以便以最优雅的方式实现这一目标.不需要跨平台支持,但性能和线程安全性是必需的.

c linux multithreading posix epoll

8
推荐指数
2
解决办法
4988
查看次数