请考虑以下情形:
test创建一个名为FIFO的FIFO .在一个终端窗口(A)中,我运行cat <test并在另一个终端窗口(B)中运行cat >test.现在可以在窗口B中写入并在窗口A中获得输出.也可以终止进程A并重新启动它,并且仍然可以使用此设置作为可疑的.但是,如果你在窗口B中终止进程,B将(据我所知)通过FIFO发送一个EOF来处理A并终止它.
实际上,如果您运行的进程不会终止于EOF,您仍然无法使用重定向到进程的FIFO.我认为这是因为这个FIFO被认为是封闭的.
反正有办法解决这个问题吗?
我遇到这个问题的原因是因为我想将命令发送到在屏幕会话中运行的我的Minecraft服务器.例如:echo "command" >FIFO_to_server.这可以通过单独使用屏幕来实现,但我对屏幕不太满意我认为仅使用管道的解决方案将更简单,更清洁.
我正在设计一个java服务器来响应多个客户端请求.所以设计基本上有一个服务器套接字,接受客户端套接字,从客户端输入/ outputStream创建一个inputObjectStream和一个outputObjectStream.
然后我在客户端上使用writeobject发出请求,在服务器上使用readObject来接收请求.处理它,将对象写回与响应相同的流,并在客户端readobject处理响应.
现在,如果我在Android模拟器/设备上运行代码工作正常.如果我在"android junit java测试用例"上运行,同样的代码,我处理完所有请求后得到一个异常.例外是在readObject调用的服务器端.
java.io.EOFException at
java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2570)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1314)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)`
Run Code Online (Sandbox Code Playgroud)
问题在iostream上读取/写入对象是否是正确的设计?
编辑
我将样本项目上传到4shared.com(http://www.4shared.com/archive/98gET_pV/Issue15426tar.html)或(http://www.sendspace.com/file/v04zjp)
测试1(通过)
控制台输出
服务器套接字已打开/127.0.0.1
客户端套接受
输入流已创建
输出流已创建
读取对象已创建
测试2(FAIL)
控制台输出
服务器套接字已打开/127.0.0.1
客户端套接受
Error : Unable to open server socket. Server wont load.
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2297)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2766)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:797)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:297)
at com.test.server.myThread.run(Main.java:52)
at com.test.server.Main.main(Main.java:32)
Run Code Online (Sandbox Code Playgroud) 我一直很难尝试在由vagrant驱动的虚拟机中执行一个简单的golang程序.这些是我的相关领域go env:
GOARCH="amd64"
GOPATH="/usr/local/src/go"
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试执行的程序(位于/ usr/local/src/go/program中):
package program
import (
"fmt"
)
func main() {
fmt.Print("Aloha")
}
Run Code Online (Sandbox Code Playgroud)
这个,我得到的输出:
main.go:4:5:
/usr/local/go/src/fmt/doc.go:1:1: expected 'package', found 'EOF'
package runtime:
/usr/local/go/src/runtime/alg.go:1:1: expected 'package', found 'EOF'
Run Code Online (Sandbox Code Playgroud)
考虑到这是一个完全假的程序.奇怪的是它完全适用于不同的环境.我在这里错过了什么?
非常感谢!
我正在使用Sublime Text 3,并希望确保在保存文件末尾只有一个新行.目前,90%的时间我的空白完美运行,使用:
"ensure_newline_at_eof_on_save": true
Run Code Online (Sandbox Code Playgroud)
和
"trim_trailing_white_space_on_save": true
Run Code Online (Sandbox Code Playgroud)
...但是,每隔一段时间文件就会在文件末尾保存两个新行.
当保存前最后一个换行符上有空格,配置设置添加换行符,然后删除空格时,就会出现这种情况.在配置中更改这些设置的顺序不能解决此问题.
我无法找到其他原因,所以它可能是唯一的原因,但理想情况下我想检查是否存在多个换行符.
我正在工作的环境未通过测试,除非文件末尾只有一个新行,所以这有点痛苦.我的问题是,是否有一个插件/方式更加严格保存,确保只有一个尾随新行.
为了我自己的娱乐,我已经编写了一个python脚本,允许我使用python进行bash one-liners; 提供python生成器表达式; 并且脚本遍历它.这是脚本:
DEFAULT_MODULES = ['os', 're', 'sys']
_g = {}
for m in DEFAULT_MODULES:
_g[m] = __import__(m)
import sys
sys.stdout.writelines(eval(sys.argv[1], _g))
Run Code Online (Sandbox Code Playgroud)
这就是你如何使用它.
$ groups | python pype.py '(l.upper() for l in sys.stdin)'
DBORNSIDE
$
Run Code Online (Sandbox Code Playgroud)
对于预期用途,它完美地工作!
但是当我不用管道输入它并直接调用它时,例如:[强调添加以显示我键入的内容]
$ python pype.py '("%r\n" % (l,) for l in sys.stdin)'
fooEnter
barEnter
bazEnter
Ctrl DCtrl D'foo\n'
'bar\n'
'baz\n'
$
为了停止接受输入并产生任何输出,我必须要么键入Enter- Ctrl D- Ctrl D或 Ctrl D- - .Ctrl D Ctrl …
Python tarfile库没有检测到损坏的tar.
user@host$ wc -c good.tar
143360 good.tar
user@host$ head -c 130000 good.tar > cut.tar
user@host$ tar -tf cut.tar
...
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
Run Code Online (Sandbox Code Playgroud)
非常好,命令行工具可识别意外的EOF.
user@host$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
>>> import tarfile
>>> tar=tarfile.open('cut.tar')
>>> tar.extractall()
Run Code Online (Sandbox Code Playgroud)
不太好.Python库对文件进行解码,但不会引发任何异常.
如何使用Python库检测意外的EOF?我想避开subprocess模块.
该参数errorlevel没有帮助.我试过errorlevel = 1和errorlevel = 2.
我有以下简单的golang程序来下载Google的隐私政策.不幸的是,unexpected EOF在读取6861字节后,它总是会因错误而崩溃,即使文档更长.为什么?
package main
import "net"
import "fmt"
import "io"
import "os"
func die(msg string, s os.Error) {
fmt.Printf("%s crashed: %v\n", msg, s)
os.Exit(1)
}
func main() {
fd, err := net.Dial("tcp", "google.com:80")
if err != nil { die("dial", err) }
req := []byte("GET /intl/en/privacy/ HTTP/1.0\r\nHost: www.google.com\r\n\r\n")
_, err = fd.Write(req)
if err != nil { die("dial write", err) }
buf := make([]byte, 1024)
nr := 1
for nr > 0 {
nr, err = io.ReadFull(fd, buf)
if …Run Code Online (Sandbox Code Playgroud) 所以我git diff --check在add-ing文件和commit-ing它们之前运行,并在我得到的两个特定文件上运行path/filename:linenumber: new blank line at EOF.如果我删除这些文件中的最后一个空行,我不会收到任何消息,但我认为使用换行符结束文件是一种很好的方式.奇怪的是,我认为其他文件具有完全相同的结尾,不会给出任何消息.我是git的新手,在OS X Yosemite上使用git 2.0.1.我使用vim作为我的编辑.
如何在避免此消息的同时以换行符结束我的文件?我应该忽略它吗?
char **query;
query = (char**) malloc ( sizeof(char*) );
int f=0;
int i=0,j=0,c;
while((c=getchar())!=EOF)
{
if(!isalpha(c))
continue;
if(f==1)
query=(char**) realloc(query,(i+1)*sizeof(char*));
query[i]=(char*) malloc(sizeof(char));
query[i][j]=c;
j++;
while( (c=getchar())!=EOF&&c!=' '&&c!='\t' )
{
query[i]=(char*) realloc(query[i],(j+1)*sizeof(char));
query[i][j]=c;
++j;
}
query[i][j]='\0';
printf("%s\n",query[i]);
if(c==EOF){
break;
}
++i;
f=1;
j=0;
}
Run Code Online (Sandbox Code Playgroud)
我希望上面的代码片段读取由空格和制表符分隔的字符串行,直到ONE EOF,但它需要2个EOF才能结束循环.此外,字符串只能由字母字符组成.
我在约2天内挣扎.请提供一些反馈.
编辑:最有可能的原因是我写完最后一个字符串而不是输入键后我按CTRL + D键,但现在我按Enter键然后按CTRL + D,它按预期工作.但是,在按下最后一个字符串后按CTRL + D后,如何将其更改为完成?
关于这个的问题已经在C中被问到 文件结尾(EOF), 但它仍然没有完全解决我的问题.
EOF在任何数据流中都没有意义stdin,例如,如果我有一些data.txt文件,fgetc()将读取所有字符并返回到文件末尾并返回-1.
我不明白的是EOFin 的概念stdin.如果我使用getchar()它,它将等待我输入一些东西,所以如果没有写入,文件结束,(EOF)不会自动返回?
因此,它是只有用户可以调用EOF在stdin按Ctrl+ Z?如果是这样,那么EOFin的一些用途是stdin什么?我想它会告诉程序继续读取,直到用户调用文件结束?是这个吗?
谢谢