小编Lon*_*ner的帖子

如何正确地将dlsym返回的指针分配给函数指针类型的变量?

我试图使用dlopen()dlsym()在我的代码,并编译它gcc.

这是第一个文件.

/* main.c */

#include <dlfcn.h>

int main()
{
    void *handle = dlopen("./foo.so", RTLD_NOW);

    if (handle) {
        void (*func)() = dlsym(handle, "func");
        func();
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是第二个文件.

/* foo.c */

#include <stdio.h>

void func()
{
    printf("hello, world\n");
}
Run Code Online (Sandbox Code Playgroud)

这是我编译和运行代码的方法.

$ gcc -std=c99 -pedantic -Wall -Wextra -shared -fPIC -o foo.so foo.c
$ gcc -std=c99 -pedantic -Wall -Wextra -ldl -o main main.c
main.c: In function ‘main’:
main.c:10:26: warning: ISO C forbids initialization between function …
Run Code Online (Sandbox Code Playgroud)

c pointers dlopen dlsym

20
推荐指数
3
解决办法
5370
查看次数

为什么列表推导中没有定义一个类变量而另一个是?

我刚刚阅读了这个问题的答案:从类定义中的列表解析中访问类变量

它帮助我理解为什么以下代码导致NameError: name 'x' is not defined:

class A:
    x = 1
    data = [0, 1, 2, 3]
    new_data = [i + x for i in data]
    print(new_data)
Run Code Online (Sandbox Code Playgroud)

NameError因为出现x在列表理解的特殊范围没有定义.但我无法理解为什么下面的代码没有任何错误.

class A:
    x = 1
    data = [0, 1, 2, 3]
    new_data = [i for i in data]
    print(new_data)
Run Code Online (Sandbox Code Playgroud)

我得到了输出[0, 1, 2, 3].但是我期待这个错误:NameError: name 'data' is not defined因为我期望就像在前面的例子中一样,名称x没有在列表推导的范围中定义,类似地,名称data也不会在列表推导的范围中定义.

能否帮助我理解为什么x列表理解范围没有定义但是data

python scope list-comprehension python-internals python-3.4

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

为什么INET6_ADDRSTRLEN在C中定义为46?

以下程序及其输出显示INET_ADDRSTRLEN定义为16INET_ADDRSTRLEN定义为46.

这是程序.

#include <stdio.h>
#include <arpa/inet.h>

int main()
{
    printf("%d\n", INET_ADDRSTRLEN);
    printf("%d\n", INET6_ADDRSTRLEN);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是输出.

16
46
Run Code Online (Sandbox Code Playgroud)

我能理解为什么INET_ADDRSTRLEN需要16.IPv4地址的最大可能字符串表示消耗15个字节,例如"255.255.255.255".因此,需要16个字节来存储具有终止空字符的IP地址.

但为什么INET6_ADDRSTRLEN需要46呢?IPv6地址的最大可能字符串表示仅消耗39个字节(根据我的知识),例如"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff".因此,只需要40个字节来存储具有终止空字符的IP地址.

是否存在可以消耗46个字节的IPv6地址的字符串表示形式?

c sockets ipv6

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

如何在多线程生产者 - 消费者模式中完成工作后退出工作线程?

我正在尝试使用Python 2.7中的Queue.Queue实现多线程生产者 - 消费者模式.我试图找出如何使消费者,即工人线程,一旦完成所有必要的工作,停止.

请参阅Martin James对此答案的第二条评论:https://stackoverflow.com/a/19369877/1175080

发送'我完成'任务,指示池线程终止.任何获得此类任务的线程都会重新排队,然后自杀.

但这对我不起作用.例如,请参阅以下代码.

import Queue
import threading
import time

def worker(n, q):
    # n - Worker ID
    # q - Queue from which to receive data
    while True:
        data = q.get()
        print 'worker', n, 'got', data
        time.sleep(1)  # Simulate noticeable data processing time
        q.task_done()
        if data == -1: # -1 is used to indicate that the worker should stop
            # Requeue the exit indicator.
            q.put(-1)
            # Commit suicide.
            print 'worker', n, 'is …
Run Code Online (Sandbox Code Playgroud)

python concurrency multithreading producer-consumer python-2.7

14
推荐指数
2
解决办法
2509
查看次数

为什么缩小使用花括号分隔初始值设定项的转换会导致错误?

我在"C++编程语言"第4版中学习了大括号分隔初始化器.>第2章:C++之旅:基础知识.

我引用下面的书.

=表格是传统的并且可以追溯到C,但是如果有疑问,请使用通用{} -list表单(第6.3.5.2节).如果不出意外,它可以帮助您避免丢失信息的转换(缩小转化次数;§10.5):

int i1 = 7.2;    // i1 becomes 7
int i2 {7.2};    // error : floating-point to integer conversion
int i3 = {7.2};  // error : floating-point to integer conversion (the = is redundant)
Run Code Online (Sandbox Code Playgroud)

但是,我无法重现这些结果.

我有以下代码.

#include <iostream>

int main()
{
    int i1 = 7.2;
    int i2 {7.2};
    int i3 = {7.2};

    std::cout << i1 << "\n";
    std::cout << i2 << "\n";
    std::cout << i3 << "\n";
}
Run Code Online (Sandbox Code Playgroud)

当我编译并运行它时,我没有得到任何错误.我收到警告,std=c++11但没有错误.

$ g++ init.cpp 
init.cpp: In function …
Run Code Online (Sandbox Code Playgroud)

c++ narrowing c++11

13
推荐指数
2
解决办法
1267
查看次数

.gitignore遵循什么模式?

这是我当前目录的内容.

$ ls
foo.foo
$ ls -a
.  ..  .bar.foo  .foo  foo.foo  .gitignore
Run Code Online (Sandbox Code Playgroud)

然后我将此目录转换为git存储库.

$ git init
Initialized empty Git repository in /home/lone/foo/.git/
$ ls -a
.  ..  .bar.foo  .foo  foo.foo  .git  .gitignore
Run Code Online (Sandbox Code Playgroud)

这是内容.gitignore.

$ cat .gitignore 
*.foo
Run Code Online (Sandbox Code Playgroud)

我看到模式的.gitignore行为与shell中的相同模式不同.在shell *.foo中只匹配非隐藏文件,即不以句点开头的文件名.

$ echo *.foo
foo.foo
Run Code Online (Sandbox Code Playgroud)

但是,*.foo.gitignore似乎匹配任何文件,隐藏或不隐藏,随结束.foo.

$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .gitignore

nothing added …
Run Code Online (Sandbox Code Playgroud)

git shell glob

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

如何在docker映像的新容器中运行bash?

我能够在从docker / whalesay映像创建的容器中运行任意shell命令。

$ docker run docker/whalesay ls -l
total 56
-rw-r--r-- 1 root root  931 May 25  2015 ChangeLog
-rw-r--r-- 1 root root  385 May 25  2015 INSTALL
-rw-r--r-- 1 root root 1116 May 25  2015 LICENSE
-rw-r--r-- 1 root root  445 May 25  2015 MANIFEST
-rw-r--r-- 1 root root 1610 May 25  2015 README
-rw-r--r-- 1 root root  879 May 25  2015 Wrap.pm.diff
drwxr-xr-x 2 root root 4096 May 25  2015 cows
-rwxr-xr-x 1 root root 4129 May …
Run Code Online (Sandbox Code Playgroud)

bash docker

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

IEEE Std 1003.1,2004版的正确名称是什么:POSIX.1-2001或POSIX.1-2004?

我在网上看到了两个POSIX文档.

  • http://pubs.opengroup.org/onlinepubs/009695399/(IEEE Std 1003.1,2004 Edition)

    摘要: 2004年版纳入了技术勘误1和技术勘误2,解决了自2001年版批准以来发现的问题.这主要是由于解决了基础文件合并引起的整合问题.

  • http://pubs.opengroup.org/onlinepubs/9699919799/(IEEE Std 1003.1™,2013 Edition)

    摘要: POSIX.1-2008同时是IEEE Std 1003.1™-2008和开放组技术标准基础规范,第7版.2013年版包括IEEE Std 1003.1-2008/Cor 1-2013,并入IEEE Std 1003.1-2008(基础文件).2013年版本纳入了技术勘误1,解决了自2008年版本批准以来发现的问题.

我想知道第一个文件是否称为POSIX.1-2001或POSIX.1-2004.

关于POSIX维基百科文章提到了第一个作为POSIX.1-2004的文章.但为什么?第一个基础文件是2001年版.所以它不应该被称为POSIX.1-2001吗?2004版仅将TC1和TC2添加到基础文档中.

例如,请参阅第二个.尽管是2013版,但由于基础文档是2008版,因此称为POSIX.1-2008.那为什么第一个不叫POSIX.1-2001?

standards posix

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

IFS =:在循环结肠分隔值时导致不同的行为

实验1

这是我在文件中命名的第一个脚本foo.sh.

IFS=:
for i in foo:bar:baz
do
    echo $i
done
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出.

$ bash foo.sh
foo bar baz
Run Code Online (Sandbox Code Playgroud)

实验2

这是我的第二个脚本.

IFS=:
for i in foo:bar:baz
do
    unset IFS
    echo $i
done
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出.

$ bash foo.sh
foo:bar:baz
Run Code Online (Sandbox Code Playgroud)

实验3

这是我的第三个脚本.

IFS=:
var=foo:bar:baz
for i in $var
do
    echo $i
done
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出.

$ bash foo.sh
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)

为什么三种情况下的输出都不同?你能解释一下IFS解释背后的规则以及导致这种不同输出的命令吗?

bash shell for-loop ifs

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

以下行为之间的区别是什么:func:和:meth:Python Sphinx中的角色?

http://www.sphinx-doc.org/en/stable/domains.html#cross-referencing-python-objects上的Sphinx文档说,

:py:func:引用Python函数; 可以使用点名.角色文本不需要包括尾随括号以增强可读性; 如果add_function_parentheses配置值为True(默认值),它们将由Sphinx自动添加.

:py:meth: 引用对象的方法.角色文本可以包括类型名称和方法名称; 如果它出现在类型的描述中,则可以省略类型名称.可以使用点状名称.

但我发现他们的行为方式没有任何区别.

这是我生成文档的Python模块.

"""foo module."""

def hello(name):
    """Print hello addressed to *name*.

    Args:
      name (str): Name to address.
    """
    print('hello', name)

class Foo:

    """Foo class."""

    def bye(self, name):
        """Print bye addressed to *name*.

        Args:
          name (str): Name to address.
        """
        print('bye', name)

if __name__ == '__main__':
    hello('world')
    Foo().bye('python')
Run Code Online (Sandbox Code Playgroud)

这就是我在index.rst文件中的内容.

Foo Documentation
=================

See :func:`foo.hello` and :func:`foo.Foo.bye`.

Also, see :meth:`foo.hello` and :meth:`foo.Foo.bye`.

foo module
==========
.. automodule:: foo
    :members:
Run Code Online (Sandbox Code Playgroud)

执行a后make …

python python-sphinx

11
推荐指数
2
解决办法
2009
查看次数