小编iab*_*der的帖子

如何知道Linux系统调用是否可重启?

SA_RESTART根据man 信号(7),如果在安装信号处理程序时使用了标志,则内核可以透明地重启某些系统调用:

如果对信号处理程序中断了对以下某个接口的阻塞调用,则在使用SA_RESTART标志后,如果信号处理程序返回,则调用将自动重新启动 ; 否则呼叫将失败并显示错误EINTR:

然后它提到了一些可以(并且不能)重新启动的系统调用,但是close()在任何一个地方都没有提到,我怎么知道是否close()可以重启或其他任何功能?是POSIX指定它还是特定于Linux的行为?我在哪里可以找到更多信息?

c linux posix system-calls

12
推荐指数
2
解决办法
2840
查看次数

为什么PyImport_Import无法从当前目录加载模块?

我正在尝试运行嵌入示例,我无法从当前工作目录加载模块,除非我明确地将其添加到sys.path它然后工作:

PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append(\".\")"); 
Run Code Online (Sandbox Code Playgroud)

Python不应该在当前目录中查找模块吗?

Edit1:尝试导入模块:

Py_Initialize();
PyRun_SimpleString("import multiply"); 
Run Code Online (Sandbox Code Playgroud)

它仍然失败,出现以下错误:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named multiply
Run Code Online (Sandbox Code Playgroud)

Edit2:来自sys.path 文档:

如果脚本目录不可用(例如,如果以交互方式调用解释器或者从标准输入读取脚本),path [0] 是空字符串,它指示Python首先搜索当前目录中的模块.

不确定它是什么意思不可用,但如果我打印sys.path[0]它不是空的:

/usr/lib/pymodules/python2.7
Run Code Online (Sandbox Code Playgroud)

python linux python-embedding python-2.7

9
推荐指数
1
解决办法
8128
查看次数

缓冲区溢出的编译器艺术

现代编译器GCC非常强大,甚至可以防止编译阶段的缓冲区溢出,因此OS无法在堆栈空间上运行代码.

例如:

void function(char *str) 
{
   char buffer[16];

   strncpy(buffer, str, 256);
}

void main() 
{
  char large_string[256];
  int i;

  for( i = 0; i < 256; i++)
    large_string[i] = 'A';

  function(large_string);
}
Run Code Online (Sandbox Code Playgroud)

我可以获得神奇的0x41414141的唯一方法是设置GCC编译参数,如:

gcc -fno-stack-protector -z execstack stackoverflow.c -o stackoverflow
Run Code Online (Sandbox Code Playgroud)

(我在ubuntu 10.04 x86清晰32位盒子上测试过它)

有什么方法可以绕过GCC堆栈粉碎保护吗?

c stack-overflow ubuntu shellcode

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

带线程本地存储的自定义内存管理器

在我们的程序中有一个自定义内存管理器,我们所有的malloc/free调用都由内存管理器管理,但是在程序的最初阶段,getpwuid()将被调用,并且在某些客户的机器上激活了nss_ldap,它将调用来自libc的malloc不是来自我们的内存管理器导致内存管理器出错,gdb的堆栈报告是:

Breakpoint 2, 0x0000003df8cc6eb0 in brk () from /lib64/libc.so.6
0  0x0000003df8cc6eb0 in brk () from /lib64/libc.so.6
1  0x0000003df8cc6f72 in sbrk () from /lib64/libc.so.6
2  0x0000003df8c73d29 in __default_morecore () from /lib64/libc.so.6
3  0x0000003df8c70090 in _int_malloc () from /lib64/libc.so.6
4  0x0000003df8c70c9d in malloc () from /lib64/libc.so.6
5  0x0000003df880fc65 in __tls_get_addr () from /lib64/ld-linux-x86-64.so.2
6  0x00002aaaae302a7c in _nss_ldap_inc_depth () from /lib64/libnss_ldap.so.2
7  0x00002aaaae2f91a4 in _nss_ldap_enter () from /lib64/libnss_ldap.so.2
8  0x00002aaaae2f942c in _nss_ldap_getbyname () from /lib64/libnss_ldap.so.2
9  0x00002aaaae2f9aa9 in _nss_ldap_getpwuid_r () from /lib64/libnss_ldap.so.2
10 …
Run Code Online (Sandbox Code Playgroud)

c c++

6
推荐指数
1
解决办法
312
查看次数

如何对根文件系统进行tar备份?

我在SD卡上安装了linux,我用这个命令来安装rootfs

tar xpjf rootfs.tar.bz -C/mnt/rootfs /

现在,我对rootfs进行了一些更改,我想创建一个备份,我可以使用上面的相同命令,我尝试使用:

tar cpjf rootfs.tar.bz2 /mnt/rootfs
and
tar cpjf rootfs.tar.bz2 -C / mnt/rootfs
I also tried
tar cpjf rootfs.tar.bz2 /mnt/rootfs/*
Run Code Online (Sandbox Code Playgroud)

并试过:

cd /mnt/rootfs
tar -cvpjf rootfs.tar.bz2 --exclude=/rootfs.tar.bz2 .
tar: ./rootfs.tar.bz2: file changed as we read it
Run Code Online (Sandbox Code Playgroud)

但我最终得到的档案在文件系统之前有两个级别,即mnt/rootfs/files我做错了什么?

linux ubuntu rootfs disk-partitioning

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

在哪里可以找到 Python 中列表推导式的形式语法?

在哪里可以找到 Python 的形式语法,特别是列表理解?

python grammar

5
推荐指数
1
解决办法
1770
查看次数

在Cython中将Python List转换为Vector <int>

我需要在cdef函数中将int的int列表转换为vector [int]以调用另一个C函数.我试过这个:

cdef pylist_to_handles(hs):
    cdef vector[int] o_vect
    for h in hs:
        o_vect.push_back(h)
    return o_vect
Run Code Online (Sandbox Code Playgroud)

这应该工作,因为我只需要从其他cdef函数调用它,但我收到此错误:

无法将'vector <int>'转换为Python对象

我究竟做错了什么 ?

python cython

3
推荐指数
2
解决办法
5865
查看次数

部署守护进程的过程和位置

我是 Linux 新手。我最近将我的 C++ 窗口服务移植到 Linux 守护进程。

在 Windows 中,我有以下文件夹结构。我发现这个结构很容易让其他同事遵循并升级到新版本。

C:\services\my_app\version_1_0\my_app.exe  
C:\services\my_app\version_1_0\my_app.config.xml  
C:\services\my_app\version_1_0\dependencies1.dll  
C:\services\my_app\version_1_0\log\my_app_20121110.log  
C:\services\my_app\version_1_0\data\my_app_data_20121110.txt  
C:\services\my_app\start_my_app.bat
Run Code Online (Sandbox Code Playgroud)

我对 Linux 中的部署位置进行了一些研究,发现很混乱:

  1. 有人说二进制文件应该部署在 /usr/bin/my_app 中
  2. 日志文件夹应为 /var/log/my_app
  3. 我应该将数据文件放在哪里?
  4. 启动脚本应放置在 /etc/init.d/my_app 中

提前感谢您的帮助。

linux windows deployment porting

3
推荐指数
1
解决办法
2254
查看次数

Libexif未定义的引用错误

我有一个使用libexif C库的程序http://libexif.sourceforge.net/

我安装了库,它位于/ usr/include/libexif

我将这些包含在程序的顶部

#include <libexif/exif-data.h>
#include <libexif/exif-content.h>
#include <libexif/exif-entry.h>
Run Code Online (Sandbox Code Playgroud)

我的编译声明:

`gcc -o test test.c` 
Run Code Online (Sandbox Code Playgroud)

当我编译时,我得到这些错误

/tmp/ccUUWpcw.o: In function `show_tag':
test.c:(.text+0x91): undefined reference to `exif_content_get_entry'
test.c:(.text+0xc0): undefined reference to `exif_entry_get_value'
test.c:(.text+0xef): undefined reference to `exif_tag_get_name_in_ifd'
/tmp/ccUUWpcw.o: In function `main':
test.c:(.text+0x179): undefined reference to `exif_data_new_from_file'
test.c:(.text+0x1cd): undefined reference to `exif_data_unref'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

该程序看到很好地读取包含的文件,但由于某种原因不知道这些功能.我在安装库时所做的就是解压缩它,./ configure,make && make install

我是否需要在其他地方引用此库或类似的东西?

谢谢你的帮助!

c linux libexif

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