Tag: linux

我怎样才能在Linux中运行一个Perl脚本作为系统守护进程?

在Linux中获取Perl脚本作为守护进程运行的简单方法是什么? 目前,这是在CentOS上。 我希望它启动与系统和closures与系统,所以一些/etc/rc.d/init.d集成也不错,但我总是可以添加一个自定义行到/etc/rc.d/rc.local 。

源文件在不同目录中的Makefile

我有一个项目的目录结构是这样的: $projectroot | +—————+—————-+ | | | part1/ part2/ part3/ | | | +——+—–+ +—+—-+ +—+—–+ | | | | | | | data/ src/ inc/ src/ inc/ src/ inc/ 我应该如何编写一个部分在/ src(或真正在哪里)可以在/ c ++源文件/ / src中完成/链接的makefile? 我可以做一些像-I $ projectroot / part1 / src -I $ projectroot / part1 / inc -I $ projectroot / part2 […]

如何从程序中调用gdb来打印它的堆栈跟踪?

现在我正在使用这样的function: #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <unistd.h> void print_trace() { char pid_buf[30]; sprintf(pid_buf, "–pid=%d", getpid()); char name_buf[512]; name_buf[readlink("/proc/self/exe", name_buf, 511)]=0; int child_pid = fork(); if (!child_pid) { dup2(2,1); // redirect output to stderr fprintf(stdout,"stack trace for %s pid=%s\n",name_buf,pid_buf); execlp("gdb", "gdb", "–batch", "-n", "-ex", "thread", "-ex", "bt", name_buf, pid_buf, NULL); abort(); /* If gdb […]

安装Raspberry Pi交叉编译器

我正在尝试为我的Ubuntu机器上的Raspberry Pi进行交叉编译。 在我最初的尝试中,我使用的是arm-linux-gnueabi编译器,它在Ubuntu的repo中可用。 我得到了这个工作。 我能够build立我所有的依赖关系,并在我的cmake项目中使用交叉编译器。 但是,我相信我应该使用hf版本,所以我切换到arm-linux-gnueabihf。 然后我意识到,这不适用于Raspberry Pi,因为它是armv6。 谷歌search后,我find了GitHub的预build工具链: https : //github.com/raspberrypi/tools 。 我下载了工具链,但是我不太懂得如何“安装”它。 我将这些文件解压到我的主目录。 目录结构如下所示: /gcc-linearo-arm-linux-gnueabihf-raspbian /arm-linux-gnueabihf /bin (contains g++, gcc, etc) /lib (contains libstdc++ library) /bin (contains arm-linux-gnueabihf-g++, arm-linux-gnueabihf-…) /lib (gcc lib stuff) 如果将目录更改为INNER bin文件夹,我可以从terminal编译testing程序,而不会出现任何问题。 ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/ arm-linux-gnueabihf/bin$ g++ test.cpp -o test 然后,我试图在OUTER bin文件夹中编译一个testing程序,其中包含工具的前缀版本。 ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$ arm-linux-gnueabihf-g++ test.cpp -o test 但是,当我尝试使用编译器(从内部bin目录之外)时,无法find工具链附带的libstdc ++共享库: arm-linux-gnueabihf-gcc: error while […]

如何使用bash脚本replace文件名中的空格

任何人都可以推荐一个安全的解决scheme,从给定的根目录开始recursion地replace文件和目录名下划线的空格? 例如: $ tree . |– a dir | `– file with spaces.txt `– b dir |– another file with spaces.txt `– yet another file with spaces.pdf 变为: $ tree . |– a_dir | `– file_with_spaces.txt `– b_dir |– another_file_with_spaces.txt `– yet_another_file_with_spaces.pdf

如何确定给定的Linux是32位还是64位?

当我键入uname -a ,它会给出以下输出。 Linux mars 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:50:33 EDT 2008 i686 i686 i386 GNU/Linux 我怎么知道给定的操作系统是32位或64位? 编写configure脚本时这很有用,例如:我在为什么构build?

将多个PDF文件合并/转换成一个PDF

我怎样才能合并/转换多个PDF文件到一个大的PDF文件? 我尝试了以下,但目标文件的内容不是预期的: convert file1.pdf file2.pdf merged.pdf 我需要一个非常简单的/基本的命令行(CLI)解决scheme。 最好的是,如果我可以将合并/转换的输出直接转换成pdf2ps (就像我以前在这里问过的问题: Linuxpipe道(convert – > pdf2ps – > lp) )。

在C中,如何在执行execvp()或类似的调用时将stdin / stdout / stderrredirect到文件?

我有以下代码: pid_t pid = fork(); if (pid == -1) { // … } else if (pid == 0) { stdin = someopenfile; stdout = someotherfile; stderr = somethirdopenfile; execvp(args[0], args); // handle error … } else { // … } 问题是, execvp()调用的input/输出仍然是控制台,而不是文件。 显然我做错了什么,做这个的正确方法是什么?

“没有X11 DISPLAYvariables” – 这是什么意思?

我想在我的Linux机器上安装一个程序(一个Java应用程序)(我正在使用Slackware)。 我收到以下错误,我不明白。 你能告诉我如何解决这个问题吗? 我不确定这是否是一个我可以在这里问的问题,因为这不是一个编程问题,但是如果你回复,我将不胜感激。 谢谢。 这里是我得到的:(我看到一些X11显示variables需要设置,但我应该给它什么样的价值?) ~$ java -jar gate-5.0-beta1-build3048-installer.jar – ERROR – java.awt.HeadlessException: No X11 DISPLAY variable was set, but this program performed an operation which requires it. java.awt.HeadlessException: No X11 DISPLAY variable was set, but this program performed an operation which requires it. at java.awt.GraphicsEnvironment.checkHeadless(Graphic sEnvironment.java:159) at java.awt.Window.<init>(Window.java:407) at java.awt.Frame.<init>(Frame.java:402) at net.sourceforge.mlf.metouia.borders.MetouiaDotsBuf fer.<init>(MetouiaDotsBuffer.java:105) […]

Linux守护进程

我在写一个Linux守护进程。 我find了两种方法来做到这一点。 通过调用fork()并设置sid守护进程。 用&运行你的程序。 哪个是正确的做法?