Articles of stdin

使用stdin通过/ proc / {pid} / fd / 0发送命令到java -jar

我试图使用/ proc / {pid} / fd / 0发送一个命令到我的世界服务器jar,但服务器不执行命令。 要复制我正在尝试做的事情,你可以在基于Debian的机器上(也可能是其他的Linux分发版)来做这件事。 我用什么来testing这个: Ubuntu 14.04 minecraft_server.jar (testing1.8) OpenJDK运行环境(使用default-jre-headless安装) 第一个控制台 $ java -jar minecraft_server.jar nogui 响应:[…服务器启动并等待input] say hi 响应:[19:52:23] [Server thread / INFO]:[Server] hi 第二个控制台 现在,当我切换到第二个控制台,与服务器仍然在第一我写: echo "say hi2" >> /proc/$(pidof java)/fd/0 一切都很好,直到我切换回第一个控制台。 我可以看到文字“说hi2”但服务器没有识别它。 我可以在第一个控制台再次写入另一个命令,就好像从第二个控制台input的文本还没有存在。 为什么是这样? 更重要的是,如何以正确的方式使用/ proc / {pid} / fd / 0将命令发送到java jar文件? 我不知道这是否是某种我不知道的Java事物,如果我在执行服务器时可以使用某个标志或某些东西,或者它是服务器JAR本身就是问题。 我知道你可以使用screen,tail -f或者某种服务器封装来实现这个function,但这不是我所追求的。 我想以某种方式发送一个使用这个方法的命令。 […]

在Linux C中将两个进程的stdoutredirect到另一个进程的stdin

我遇到了有关多进程redirect标准输出的问题。 假设我有进程A,我在A中使用fork(),然后得到进程A和B.然后我在B中使用fork(),最后得到进程A,B和C.B和C都在执行其他程序EXEC()。 现在,我尝试使用两个pipe道将A和B的stdoutredirect到C的stdin。 #include<unistd.h> #include<stdio.h> #include<sty/types.h> int main() { int AtoC [2]; pipe(AtoC); int fd1,fd2; fd1=fork(); if(fd1>0) { /***In process A, I do the following steps: ***/ close(AtoC[0]); dup2(AtoC[1], STDOUT_FILENO); /* program running in process A */ } else { int BtoC [2]; pipe(BtoC); fd2=fork(); if(fd2>0) { /***In process B, I do the following steps: […]

如何将string推送到stdin? 在启动时通过stdin提供input,然后交互地读取stdininput

调用它时,有没有办法将一个string“推”到程序的标准inputstream? 所以我们会有效果的 echo "something" | ./my_program 但不是在"something"之后读取EOF, my_program会从原始标准input(例如键盘)读取其进一步的input。 例如:假设我们想要启动一个bash shell,但是我们想要做的第一件事就是调用date 。 echo date | bash echo date | bash不会做这个工作,因为shell会在运行date之后终止。

非阻塞获取字符

平台:Linux 3.2.0 x86(Debian 7) 编译器:GCC 4.7.2(Debian 4.7.2-5) 我正在写一个函数,如果一个字符已经存在于标准input中,它将从标准input读取单个字符。 如果标准input为空,则该函数假设不执行任何操作并返回-1。 我googled非阻塞input,并被指向poll()或select() 。 首先,我尝试使用select(),但我无法得到它的工作,所以我尝试了poll(),并得出了相同的结论。 我不确定这些函数做了什么,但是从我所了解的poll()的文档来看,如果我这样称呼: struct pollfd pollfds; pollfds = STDIN_FILENO; pollfds.events = POLLIN; poll(pollfds, 1, 0); 如果(pollfds.revents&POLLIN)将为真,如果“高优先级数据以外的数据可以不被阻塞地读取”。 但是poll()总是在我的testing情况下超时。 我如何testingfunction可能是问题,但我想要的function正是我所testing的。 这里是目前的function和testing情况。 #include <poll.h> #include <stdio.h> #include <unistd.h> int ngetc(char *c) { struct pollfd pollfds; pollfds.fd = STDIN_FILENO; pollfds.events = POLLIN; poll(&pollfds, 1, 0); if(pollfds.revents & POLLIN) { […]

linux – 从一个terminal写入命令到另一个terminal

我需要从一个terminal写命令到另一个terminal。 我试过这些: echo -e "ls\n" > /proc/pid/fd/0 echo -e "ls\n" > /dev/pts/4 这只是打印ls作为输出,不执行。 我试过这些: chmod 777 /dev/tty4 ;echo "ls" > /dev/tty4 chmod 777 /dev/tty40 ;echo "ls" > /dev/tty40 哪些似乎没有做任何事情 有任何想法吗? [注意,我不想触摸第二个terminal来完成这个任务。 只有第一个]

如何从bash提供mysql查询

我试图做一个bash脚本,创build一个mysql用户和数据库,但我找不到一个方法来提供到MySQL mysql,我想这样的格式: mysql < echo "query" 但是这是行不通的,看下面的例子: mysql –host=localhost –user=user –password=password < echo "CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'jakdJxct8W'; CREATE DATABASE IF NOT EXISTS 'testuser_dev' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; GRANT ALL PRIVILEGES ON 'testuser_dev' . * TO 'testuser'@'localhost'; CREATE DATABASE IF NOT EXISTS 'testuser_qa' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; GRANT ALL PRIVILEGES […]

如何在按键后立即读取terminal的input缓冲区

我想阅读我的c程序中的箭头按键,并用其他stringreplace它们(立即在terminal本身)。 我正在试图在unixterminal中实现bash历史function。 我写了这个代码。 int main(int argc, char *argv[]) { char c; char str[1024]; int i = 0; while((c = fgetc(stdin)) != '\n'){ if(((int)c) == 27){ c=fgetc(stdin); c=fgetc(stdin); if (c == 'A') { printf("%c[A%c[2K",27, 27); printf("UP"); } } str[i++] = c; } printf("\n"); return 0; } 但是,这不起作用,因为terminal等待换行符或EOF发送input缓冲区到标准input。 所以,我必须按回车键来分析用户input。 在这个答案中 ,用户提到使用system ("/bin/stty raw"); 但是这会取代所有的默认terminal行为(例如退格,删除等)。 那么,有没有什么方法可以直接读取/操作terminalinput缓冲区,如果检测到箭头按键,就可以调整缓冲区本身? 环境 – […]

如何检查CLI程序是否正在等待来自stdin的input?

我怎样才能检查一个CLI程序,我刚刚开始使用CreateProcess(),是否正在等待来自stdin与Windows C API的input?

WIndows:subprocess制作新的控制台窗口,丢失stdin / out

我正在使用Windows Vista和Python 2.7.2,但答案不需要在Python中。 所以我可以使用命令行程序(例如dir)来启动并与subprocessstdin / stdout进行交互(使用python)。 – 然而 – 我现在想要调用的程序喜欢在Windows(不是诅咒)上为自己创build一个新的控制台窗口,即使从一个预先存在的cmd.exe窗口运行,也可以使用新的句柄。 (奇怪,因为它是VLC的“遥控”界面。)有什么办法可以: 获取进程控制台的stdin / out的句柄; 要么 让新的shell在旧版本中运行(如从bash中调用bash)? 否则,我可以破解subprocess的代码,将如何在Windows中设置新的控制台,并在/输出转移? 编辑:也就是说 >>> p = Popen(args=['vlc','-I','rc'],stdin=PIPE,stdout=PIPE) # [New console appears with text, asking for commands] >>> p.stdin.write("quit\r\n") Traceback: File "<stdin>", line 1, in <module> IOError: [Errno 22] Invalid argument >>> p.stdout.readline() '' >>> p.stdout.readline() '' # […] 但是新出现的控制台窗口也不接受键盘input。 通常情况下: […]

是否可以pipe脚本到WScript?

我想执行由我的应用程序使用Windows脚本宿主(wscript.exe或cscript.exe)生成的简单的VBScript / JScript,而不生成临时脚本文件。 我没有find一个命令行选项来读取脚本forms的标准inputstream,但我没有发现在WWW的几个地方,文件的WScript错误消息“无法从标准input读取脚本”。 MSDN Windows脚本主机参考 – 错误消息 那么是否有一个隐藏的命令行选项从标准中读取脚本? 目前我的程序生成一个小脚本,并将其写入临时文件。 然后创build一个运行cscript.exe的subprocess,等待它完成,然后再次删除临时文件。 我想摆脱临时文件,并将脚本直接传递给脚本宿主,如果可能的话。 (例如,将其pipe道传输到cscript.exe或将其作为类似于cmd.exe的/ c命令行选项的命令行参数的一部分传递)