小编yot*_*ota的帖子

全局变量,共享库和-fPIC效果

我制作了一段代码,其中包含一个动态库(lib.c)和一个主可执行文件(main.c).在这两个文件,我定义一个名为一个全局变量:int global.不是很聪明,但这不是问题.

当我编译动态库时,该-fPIC选项似乎是强制性的:

gcc lib.c -fPIC -shared -o lib.so
Run Code Online (Sandbox Code Playgroud)

否则我得到:

/usr/bin/ld: /tmp/ccpUvIPj.o: relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC
Run Code Online (Sandbox Code Playgroud)

当我编译可执行文件时,它不是.

gcc main.c -fPIC -ldl
gcc main.c -ldl
Run Code Online (Sandbox Code Playgroud)

两者都有效,但有不同的行为,我无法解释,是吗?:

使用-fPIC,main.c中的global和lib.c中的global是相同的变量:

global main: 23 (0x601050)
global lib: 23 (0x601050)
Run Code Online (Sandbox Code Playgroud)

没有-fPIC,lib.c中的global与main.c中的global不相关:

global main: 23 (0x601048)
global lib: 0 (0x7f7742e64028)
Run Code Online (Sandbox Code Playgroud)

这是来源:

lib.c

#include <stdio.h>
#include <stdlib.h>

int global;

int f_one() {

    printf("global lib: %d (%p)\n", global, &global); …
Run Code Online (Sandbox Code Playgroud)

c fpic dynamic-library

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

如何在没有 Node.js 的情况下使用摩纳哥编辑器

我需要将 monaco-editor 与纯客户端解决方案集成在网页上,并且无需使用 Node.js。

我在 @SimperT How to Implement monaco-editor on a web without Nodejs and Electron找到了一个很好的答案,但他的存储库已经过时了(js 是一个狂野的世界),而且我有一个额外的限制,即文件只能在本地提供(没有 CDN) ,其用于 Intranet,无需外部访问)。

所以,这有点像瓶子里的信息,但如果有人有关于如何做到这一点的线索或指示,我会洗耳恭听......(如果我想出解决方案,我会将其发布在这里)

monaco-editor

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

python3 os.mkdir() 不强制执行正确的模式

它是一个错误还是一个功能?

当我使用os.mkdir(idem with pathlib.Path.mkdir) 和显式模式创建目录时,创建的目录的权限不适合。如果我os.chmod再次强制执行,它会起作用......

>>> import sys, os
>>> sys.version
'3.4.3 (default, Feb 27 2015, 18:13:37) \n[GCC 4.4.5]'
>>> os.mkdir('truite', mode=0o2770)
>>> oct(os.stat('truite').st_mode)
'0o40750'
>>> os.chmod('truite', 0o2770)
>>> oct(os.stat('truite').st_mode)
'0o42770'
Run Code Online (Sandbox Code Playgroud)

因为我希望能够与父母和模式 o2770 创建一个目录,这里是代码(pth是一个pathlib.Path对象):

def make_shared_dir(pth) :
    if not pth.parent.is_dir() :
        make_shared_dir(pth.parent)
    if not pth.is_dir() :
        pth.mkdir()
    pth.chmod(0o2770)   
Run Code Online (Sandbox Code Playgroud)

mkdir python-3.x

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

具有复杂参数的Python子进程

我正在寻找从python(3)调用shell命令的最安全和最方便的方法.这里是ps到pdf的转换:

 gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="${pdf_file}" "${ps_file}"
Run Code Online (Sandbox Code Playgroud)

我使用subprocess,shlex并避免shell=True.但我发现结果命令不一致:

cmd = ['gs', '-dBATCH', '-dNOPAUSE', '-sDEVICE=pdfwrite', '-sOutputFile={0}'.format(pdf_filename), ps_filename]
Run Code Online (Sandbox Code Playgroud)

我错过了什么?!subprocess.call()语法看起来很干净,空格分隔的参数,在其他地方看起来一团糟.

在以下之间调用subprocess.call(cmd)(在python级别,即转义,注入保护,引用等)时有什么区别:

cmd = ['do', '--something', arg]
cmd = ['do', '--someting {0}'.format(arg)]
Run Code Online (Sandbox Code Playgroud)

如果没有,这也是一个很好的方法吗?

cmd = ['gs', '-dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile={0} {1}'.format(pdf_filename, ps_filename)]
Run Code Online (Sandbox Code Playgroud)

另一个不一致的例子:

hg merge -r 3 将会 cmd = ['hg', 'merge', '-r', revision_id]

hg merge --rev=3 将会 cmd = ['hg', 'merge', '--rev={0}'.format(revision_id)]

尽管如此,发送相同的参数有两种方法.

python subprocess python-3.x

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