小编zwo*_*wol的帖子

缓冲写入 Node.js 中的 stdout

在 Node.js 中,process.stdout流被记录为“同步”运行,这意味着每次调用都会stdout.write导致立即write系统调用 - 没有缓冲。例如

import { stdout } from 'process';

for (let i = 1; i <= 1000; i++) {
    stdout.write(`line ${i}\n`);
}
stdout.end();
Run Code Online (Sandbox Code Playgroud)

进行 1000 次write系统调用。当您编写传统的 Unix 数据发送实用程序时,这不是您想要的。可以绕过process.stdout并创建一个单独的可写流,该流下沉到文件描述符 1,例如

import { stdout } from 'process';
import { createWriteStream } from 'fs';
let ostream = createWriteStream("/ignored", { fd: stdout.fd });
for (let i = 1; i <= 1000; i++) {
    ostream.write(`line ${i}\n`);
}
ostream.end();
Run Code Online (Sandbox Code Playgroud)

仅进行一次系统调用。然而,像这样的绕过是危险的——调用之后ostream.end,文件描述符 1 …

node.js

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

如果 Python 可用,则有选择地启用测试程序 - automake

我有一个用 C 编写的程序,使用 automake/autoconf 构建,并且有两个测试套件。一个是同样用 C 编写的单元测试套件;另一个是端到端的,并且(目前)是用 Python 编写的。我希望“make check”始终运行单元测试,并且仅在安装了 Python 的情况下才进行端到端测试。这就是我现在所拥有的:

TESTS = unittests
if HAVE_PYTHON
TESTS += tester.py
tester_py_SOURCES = src/test/tester.py.in

tester.py: src/test/tester.py.in Makefile
        $(SED) -e 's,[@]PYTHON[@],$(PYTHON),' < $< > $@
        chmod +x $@
endif
Run Code Online (Sandbox Code Playgroud)

HAVE_PYTHON 由配置脚本设置

AM_PATH_PYTHON([2.6],, [:])
AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != ":"])
Run Code Online (Sandbox Code Playgroud)

这在 Unix 上正常工作,但在 Windows 上因“没有规则来制作 tester.py.exe”而爆炸。此外,使#!线路正确的复制和替换技术意味着我无法将测试套件分解为多个模块。

有一个更好的方法吗?

python automake portability

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

中断安全设置扫描

我需要一个满足这些有点不寻常(AFAIK)要求的数据结构:

  1. 支持的操作是插入(设置,项目),删除(设置,项目)和ForAll(设置,操作)
  2. 插入和删除是罕见的操作.该集合通常只包含一个项目.
  3. 实施必须在C中可行; 特别是,没有垃圾收集.
  4. ForAll必须安全地从异步信号处理程序执行,其调用可能已中断插入或删除.

当然,最后一项要求是杀手.我有一个玩具实现,它会在全局链表中引发全局锁定,但如果信号处理程序中断了一个关键部分,那将会死锁.

(我知道在信号处理程序中执行任何代码的所有问题;出于这个问题的目的,让我们关注如何在可能中断插入或删除时使ForAll崩溃和死锁安全.)

c algorithm concurrency data-structures

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

强制套接字断开而不伪造RST,Linux

我有一个网络客户端,它被困在recvfrom不受我控制的服务器中,24 小时以上后,该服务器可能永远不会响应。该程序已经处理了大量的数据,所以我不想杀死它;我希望它放弃当前的连接并继续。(如果返回 EOF 或 -1,它将正确执行此操作recvfrom。)我已经尝试了几种不同的程序,这些程序声称能够通过伪造 RST ( tcpkillcutterkillcx) 来断开陈旧的 TCP 通道;没有任何效果,程序仍然停留在recvfrom. 我也尝试过关闭网络接口;再次,没有效果。

在我看来,确实应该有一种方法可以在套接字 API 级别强制断开连接,而无需伪造网络数据包。我不介意可怕的黑客攻击,包括手动刺探内核数据结构;这是灾难恢复的情况。有什么建议么?

(为清楚起见,根据 ,此处涉及的 TCP 通道处于 ESTABLISHED 状态lsof。)

sockets linux tcp

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

在地图投影后不连续时修复匀称的多边形对象

这个演示程序(打算在IPython的笔记本电脑上运行,你需要matplotlibmpl_toolkits.basemappyproj,和shapely)应该绘制地球表面上越来越大的圆圈。只要圆圈不越过其中一个极点,它就可以正常工作。如果发生这种情况,在地图上绘制时结果完全是无稽之谈(见下面的单元格 2)

如果我将它们绘制在“空白”而不是地图上(见下面的单元格 3),结果是正确的,因为如果你删除了从 +180 到 -180 经度的水平线,曲线的其余部分将确实划定了所需圆的内部和外部之间的边界。然而,他们的错误在于多边形是无效的(.is_valid是假的),更重要的是,多边形的非零缠绕数内部没有包围地图的正确区域。

我相信这是因为shapely.ops.transform对 +180==-180 经度的坐标奇点视而不见。该问题是,我怎么发现问题和维修的多边形,所以它的封装做地图的正确的区域?在这种情况下,适当的修正是将 (X,+180) -- (X,-180) 的水平线段替换为三行, (X,+180) -- (+90,+180) -- (+90,-180) -- (X,-180); 但要注意的是,如果圈走了在磁极,该修正线需要,而不是去南方。如果这个圆圈已经超过了两者极点,我们将再次有一个有效的多边形,但它的内部将是它应该是什么的补充。我需要检测所有这些情况并正确处理它们。另外,我不知道如何“编辑”匀称的几何对象。

可下载的笔记本:https : //gist.github.com/zackw/e48cb1580ff37acfee4d0a7b1d43a037

## cell 1
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

import pyproj
from shapely.geometry import Point, Polygon, MultiPolygon
from shapely.ops import transform as sh_transform …
Run Code Online (Sandbox Code Playgroud)

python maps geospatial shapely

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

"await future"和"await asyncio.wait_for(future,None)"之间有区别吗?

使用python 3.5或更高版本,直接应用于await未来或任务与包装它之间有什么区别asyncio.wait_for吗?文档不清楚何时适合使用wait_for,我想知道它是否是旧的基于生成器的库的遗迹.下面的测试程序似乎没有显示出任何差异,但这并没有真正证明什么.

import asyncio

async def task_one():
    await asyncio.sleep(0.1)
    return 1

async def task_two():
    await asyncio.sleep(0.1)
    return 2

async def test(loop):
    t1 = loop.create_task(task_one())
    t2 = loop.create_task(task_two())

    print(repr(await t1))
    print(repr(await asyncio.wait_for(t2, None)))

def main():
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(test(loop))
    finally:
        loop.close()

main()
Run Code Online (Sandbox Code Playgroud)

python python-asyncio python-3.5

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

Why I cannot compile with -fPIE but can with -fPIC?

I have one interesting compilation problem. At first, please see code to be compiled.

$ ls
Makefile main.c sub.c sub.h
$ gcc -v
...
gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
Run Code Online (Sandbox Code Playgroud)
## Makefile
%.o: CFLAGS+=-fPIE #[2]

main.so: main.o sub.o
    $(CC) -shared -fPIC -o $@ $^
Run Code Online (Sandbox Code Playgroud)
$ ls
Makefile main.c sub.c sub.h
$ gcc -v
...
gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
Run Code Online (Sandbox Code Playgroud)
## Makefile
%.o: CFLAGS+=-fPIE #[2]

main.so: main.o sub.o
    $(CC) -shared -fPIC -o $@ $^
Run Code Online (Sandbox Code Playgroud)
//main.c
#include …
Run Code Online (Sandbox Code Playgroud)

c linux gcc fpic position-independent-code

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

使用`ld`链接时出现"未定义的符号引用"错误

我是在Linux上编写程序的新手.我有一个使用一个单独的模块程序shm_open,ftruncate,mmap,fork,和wait.我编译了这个程序,gcc -c然后将其链接ld -lrt(需要librt shm_open),我得到一个奇怪的链接器错误:

undefined reference to symbol 'waitpid@@GLIBC_2.2.5'
Run Code Online (Sandbox Code Playgroud)

该联机帮助wait表示

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
   waitid():
       Since glibc 2.26: _XOPEN_SOURCE >= 500 ||
           _POSIX_C_SOURCE >= 200809L
       Glibc 2.25 and earlier:
           _XOPEN_SOURCE
Run Code Online (Sandbox Code Playgroud)

#define _XOPEN_SOURCE如果我这样做,那么输入代码就无济于事了

gcc -c -D _XOPEN_SOURCE 
Run Code Online (Sandbox Code Playgroud)

编译器说隐式声明ftruncate.

我在VMWare下运行Ubuntu.GCC是版本gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609.

可能有什么不对?

c glibc undefined-reference

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

`pip install --upgrade pip` 在 Windows virtualenv 中失败并显示“拒绝访问”

在 Windows 上,如果您尝试pip在 virtualenv 中自我升级,您可能会收到一个神秘的“访问被拒绝”错误。例如:

D:\scratch\> C:\Program Files\Python\3.7.4\x64\python.exe -m venv D:\scratch\my-venv
D:\scratch\> D:\scratch\my-venv\Scripts\activate
(my-venv) D:\scratch\> pip install --upgrade pip

Collecting pip
  Downloading pip-19.3.1-py2.py3-none-any.whl (1.4MB)
Installing collected packages: pip
  Found existing installation: pip 19.0.3
    Uninstalling pip-19.0.3:
Could not install packages due to an EnvironmentError: 
  [WinError 5] Access is denied: 'd:\\scratch\\my-venv\\scripts\\pip.exe'
Consider using the `--user` option or check the permissions.
Run Code Online (Sandbox Code Playgroud)

无论命令提示符是否具有管理权限,都会发生这种情况。我们知道我们对里面的所有东西都有写访问权限d:\scratch\my-venv,因为我们刚刚用初始python -m venv命令创建了它。使用该--user选项的建议无济于事,因为我们想升级virtualenv 中的 pip 版本,但这是--user行不通的。

可能有什么问题,在 Windows 上的 virtualenv …

python windows pip virtualenv

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

内存未通过 mmap() 中的 MAP_ANONYMOUS 和 MAP_SHARED_VALIDATE 标志分配

我正在尝试使用 MAP_ANONYMOUS 标志分配内存块,但它没有与 MAP_SHARED_VALIDATE 标志一起创建任何内存块,而是带有 MAP_PRIVATE 或 MAP_SHARED 标志的 MAP_ANONYMOUS 创建了内存块。有人可以解释为什么会发生这种情况。

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/mman.h>
#include <unistd.h>

int main(void)
{
  size_t size = getpagesize();

  errno = 0;
  void *first = mmap(0, size, PROT_READ|PROT_WRITE,
                     MAP_ANONYMOUS|MAP_SHARED_VALIDATE, -1, 0);
  printf("first: %p %s\n", first, strerror(errno));

  errno = 0;
  void *second = mmap(0, size, PROT_READ|PROT_WRITE,
                      MAP_ANONYMOUS|MAP_SHARED, -1, 0);
  printf("second: %p %s\n", second, strerror(errno));

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

已经观察到在 Linux 4.19 和 Linux 5.8 上打印,

first: 0xffffffffffffffff Invalid argument
second: 0x7f56b274d000 Success
Run Code Online (Sandbox Code Playgroud)

这些标志 …

c unix linux mmap

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