我的套接字似乎有问题.下面,您将看到一些分叉服务器和客户端的代码.服务器打开TCP套接字,客户端连接到它,然后关闭它.睡眠用于协调时间.在客户端关闭()之后,服务器尝试将write()写入其自己的TCP连接端.根据write(2)手册页,这应该给我一个SIGPIPE和一个EPIPE错误.但是,我没有看到这一点.从服务器的角度来看,写入本地已关闭的套接字成功,如果没有EPIPE,我无法看到服务器应该如何检测到客户端已关闭套接字.
在关闭其结束的客户端和尝试写入的服务器之间的间隙中,对netstat的调用将显示连接处于CLOSE_WAIT/FIN_WAIT2状态,因此服务器端应该绝对能够拒绝写入.
作为参考,我在Debian Squeeze上,uname -r是2.6.39-bpo.2-amd64.
这里发生了什么?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/tcp.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <netdb.h>
#define SERVER_ADDRESS "127.0.0.7"
#define SERVER_PORT 4777
#define myfail_if( test, msg ) do { if((test)){ fprintf(stderr, msg "\n"); exit(1); } } while (0)
#define myfail_unless( test, msg ) myfail_if( !(test), msg )
int connect_client( char *addr, int actual_port )
{
int client_fd;
struct addrinfo hint;
struct addrinfo …
Run Code Online (Sandbox Code Playgroud) 这是我在使用更大的 Dockerfile 时遇到的问题的简化示例。
这是一个Dockerfile
:
FROM alpine:latest AS base
COPY docker-compose.yml /tmp/docker-compose.yml
RUN touch /tmp/foo
Run Code Online (Sandbox Code Playgroud)
这是一个docker-compose.yml
:
version: '3.5'
services:
web:
build:
context: .
Run Code Online (Sandbox Code Playgroud)
我期望的是docker build
能够重用docker-compose
构建的缓存层。我跑步时看到的docker-compose build web
是:
$ docker-compose build web
Building web
Step 1/3 : FROM alpine:latest AS base
---> f70734b6a266
Step 2/3 : COPY docker-compose.yml /tmp/docker-compose.yml
---> 764c54eb3dd4
Step 3/3 : RUN touch /tmp/foo
---> Running in 77bdf96af899
Removing intermediate container 77bdf96af899
---> 7d8197f7004f
Successfully built 7d8197f7004f
Successfully tagged …
Run Code Online (Sandbox Code Playgroud) 我需要使用hg关键字扩展将构建日期和修订嵌入到源文件中.撇开整个"你真的不想做那个"的论点,我怎么能这样做呢?
这是我的源文件(lib/foo/version.rb
)看起来像什么(恰好是Ruby,但从我的构建中我没有"编译"步骤的观点来看,这只是相关的,我可以做-DREVISION ="$( hg id)"in):
module Foo
VERSION = {
:date => "$Date$",
:changeset => "$Revision$"
}
end
Run Code Online (Sandbox Code Playgroud)
问题是$ Revision $和$ Date $随着该文件的变更集和提交日期而扩展,而我需要的是整个存储库的tip更改集和提交日期.
我没有看到可以使用的明显模板hg help templates
,关键字扩展也没有提到具有全局范围的任何内容.我正在尝试做什么?
我有一种感觉,我错过了一些明显的东西,但我不知道从哪里开始寻找.
我有一个新的黑色应用程序,因此创建:
$ lein noir new hiworld
Run Code Online (Sandbox Code Playgroud)
我向src/hiworld/server.clj添加了一个新的页面处理程序:
(ns hiworld.server
(:require [noir.server :as server]))
(server/load-views "src/hiworld/views/")
(def handler (server/gen-handler {:mode :dev
:ns 'hiworld}))
Run Code Online (Sandbox Code Playgroud)
我将project.clj设置为响铃:
(defproject hiworld "0.1.0-SNAPSHOT"
:description "FIXME: write this!"
:dependencies [[org.clojure/clojure "1.3.0"]
[noir "1.2.2-SNAPSHOT"]]
:dev-dependencies [[lein-ring "0.5.4"]]
:ring {:handler hiworld.server/handler}
:main hiworld.server)
Run Code Online (Sandbox Code Playgroud)
检查它在本地工作:
$ lein deps
$ lein ring server-headless
# elsewhere
$ curl -I localhost:3000/welcome
HTTP/1.1 200 OK
Date: Mon, 20 Feb 2012 08:51:15 GMT
Set-Cookie: ring-session=ef00a7ad-2061-4026-9d94-3ed86ec8c46c;Path=/
Content-Type: text/html; charset=utf-8
Content-Length: 0
Server: Jetty(6.1.25)
Run Code Online (Sandbox Code Playgroud)
我建立了一场战争:
$ lein …
Run Code Online (Sandbox Code Playgroud) 我在文档中看不到这一点,但我认为这是一个已解决的问题.
我在Rails之外使用ActiveRecord,我的脚本加载从另一个应用程序转储的schema.rb.我想加载此架构而不将迁移输出转储到stdout,但替换ActiveRecord :: Base.logger不会将其关闭.我最重要的是要阻止噪音?
在我的构建链中,我需要这样做:
objcopy -I binary -O $BFDNAME -B $BFDARCH <this> <that>
Run Code Online (Sandbox Code Playgroud)
为了将二进制文件转换为库形式。因为我希望其他人能够使用它,所以我需要知道在运行构建时如何从他们的工具链中获取 $BFDNAME 和 $BFDARCH。我可以通过对我已经构建的文件运行 objdump -f 来在本地获取值,但是有没有更好的方法,不会让我仅仅为了获取配置值而编译废弃文件?
我有一个静态ELF二进制文件,它从zip文件中读取数据.为了简化分发,我想将zipfile附加到二进制文件,如下所示:
$ cat mydata.zip >> mybinary
Run Code Online (Sandbox Code Playgroud)
我知道这样做不会损害mybinary,但我不知道如何访问mydata.zip的内容.可能吗?如果是这样,怎么样?
在过去,我使用了附加数据然后附加数据长度的技巧,因此我所要做的就是打开二进制文件,读取流的最后一个int,回退那个长度然后开始解压缩,但是由于各种原因在这里不起作用(例如,我不能保证当需要zipfile时文件仍然在光盘上).
如果解决方案适用于OS X和MinGW,那么全面超级双倍加分.
我试图查找物理驱动器号(如,我需要N
在\\.\PhysicalDriveN
打开读取的块设备)从光盘驱动器在Windows 7的驱动器盘符本页面表明IOCTL_STORAGE_GET_DEVICE_NUMBER应该工作,但它返回0表示C:和D的驱动器号:(其中D:是可移动驱动器),因此不能正确.还建议使用IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,但在D:上失败并出现ERROR_INVALID_FUNCTION.
我不禁觉得我错过了某个关键概念.
这是我的代码:
#include "stdafx.h"
#include "Windows.h"
void printLastError(){
DWORD lastError;
DWORD bytesReturned;
WCHAR outbuf[2048];
lastError = GetLastError();
bytesReturned = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL, lastError, LANG_USER_DEFAULT, outbuf, 2048, NULL);
if (bytesReturned > 0){
wprintf(outbuf);
} else {
printf("Error %d while formatting error %d\n", GetLastError(), lastError);
}
}
void readDeviceNumberByExtents(HANDLE hFile){
BOOL ioctlSuccess;
DWORD bytesReturned;
VOLUME_DISK_EXTENTS vde;
ioctlSuccess = DeviceIoControl(hFile,
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
NULL, 0, &vde, sizeof(vde), &bytesReturned, NULL);
if (ioctlSuccess != 0){
printf("%d\n", vde.Extents->DiskNumber );
} else …
Run Code Online (Sandbox Code Playgroud) 这应该是一个简单的问题,但我不知道我的方法很好地找到答案.
如果OTP管理程序在崩溃后重新启动gen_server,新的子进程是否会继承崩溃进程的消息队列,还是在崩溃之前发送但尚未被丢弃在地板上的旧子进程处理的消息?
我在haskell平台上,在Debian Squeeze上安装了apt-get GHC 6.12.1.我如何从IOError中获取底层错误,因为我需要它在最初引发它的不同线程上?
我需要这个的原因是因为我正在实现一个网络协议,它暴露了线路上的实际errno值.我需要重建吗?
如何使用仅包含二进制数据的静态库(没有任何目标代码),并将该数据提供给C程序?这是我正在努力工作的构建过程和简化代码:
./datafile
:
abcdefghij
Run Code Online (Sandbox Code Playgroud)
Makefile
:
libdatafile.a:
ar [magic] datafile
main: libdatafile.a
gcc main.c libdatafile.a -o main
Run Code Online (Sandbox Code Playgroud)
main.c
:
#define TEXTPTR [more magic]
int main(){
char mystring[11];
memset(mystring, '\0', 11);
memcpy(TEXTPTR, mystring, 10);
puts(mystring);
puts(mystring);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期望从运行中获得的输出main
当然是:
abcdefghijabcdefghij
Run Code Online (Sandbox Code Playgroud)
我的问题是:[魔法]和[更神奇]应该是什么?
gcc ×3
build ×2
c ×2
linux ×2
activerecord ×1
binutils ×1
clojure ×1
commit ×1
deployment ×1
docker ×1
dockerfile ×1
elf ×1
erlang ×1
erlang-otp ×1
errno ×1
ghc ×1
glibc ×1
gnu ×1
haskell ×1
io ×1
jetty ×1
keyword ×1
ld ×1
mercurial ×1
noir ×1
resources ×1
ruby ×1
servlets ×1
sockets ×1
tcp ×1
visual-c++ ×1
winapi ×1
windows-7 ×1