如何获取充当 stdin/stdout 的文件的名称?

2023-11-21

我遇到以下问题。我想用 Fortran90 编写一个程序,我希望能够像这样调用:

./program.x < main.in > main.out

除了“main.out”(我可以在调用程序时设置其名称)之外,还必须编写辅助输出,我希望它们具有与“main.in”或“main.out”类似的名称(它们是实际上并不称为“主”);但是,当我使用:

INQUIRE(UNIT=5,NAME=sInputName)

sInputName 的内容变为“Stdin”,而不是文件名。有没有办法在调用程序时获取链接到 stdin/stdout 的文件名?


不幸的是,I/O 重定向的要点是您的程序不必知道输入/输出文件是什么。在基于 UNIX 的系统上,您不能将命令行参数视为< main.in > main.out实际上是由 shell 处理的,shell 在调用程序之前使用这些文件来设置标准输入和输出。

您必须记住,有时标准输入和输出甚至不是文件,因为它们可能是终端或管道。例如

./generate_input | ./program.x | less

因此,一种解决方案是重新设计程序,使输出文件成为显式参数。

./program.x --out=main.out

这样你的程序就知道文件名。代价是您的程序现在负责打开(并且可能创建)文件。

也就是说,在 Linux 系统上,您实际上可以找到标准文件句柄从特殊的 /proc 文件系统指向的位置。每个文件描述符都会有符号链接

/proc/<process_id>/fd/0 -> standard_input
/proc/<process_id>/fd/1 -> standard_output
/proc/<process_id>/fd/2 -> standard_error

抱歉,我不懂 fortran,但检查输出文件的伪代码方法可能是:

out_name = realLink( "/proc/"+getpid()+"/fd/1" )
if( isNormalFile( out_name ) )
    ...

请记住我之前所说的,不能保证这实际上是一个普通文件。它可以是一个终端设备,一个管道,一个网络套接字,等等......另外,我不知道除了 redhat/centos linux 之外,它还可以在哪些其他操作系统上运行,所以它可能不那么便携。更多的是一种诊断工具。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取充当 stdin/stdout 的文件的名称? 的相关文章

  • Python3中如何使用StringIO?

    我使用的是 Python 3 2 1 无法导入StringIO模块 我用io StringIO它可以工作 但我不能使用它numpy s genfromtxt 像这样 x 1 3 n 4 5 8 numpy genfromtxt io Str
  • 如何避免在 Rust 中使用标准输入换行

    我有这个代码 fn main let mut stdin io stdin let input mut String new loop input clear print Your age stdin read line input pri
  • X86 从 stdin 读取并写入 stdout,无需引用标准库

    我是 X86 汇编语言的初学者 我知道如何使用内置函数从标准输入读取数据并写入标准输出 但我不确定如何使用简单的汇编代码 即操作寄存器和利用系统调用 来做到这一点 include
  • 如何在 R 中关闭管道连接之前获取输出?

    在 R 中 我们可以使用以下命令打开管道连接pipe 并写信给它 我观察到以下情况 我不太明白 让我们使用一个python管道例如 z pipe python open w cat x 1 n file z cat print x n fi
  • 如何在 Java 中读取/转换 InputStream 为字符串?

    如果你有一个java io InputStream对象 您应该如何处理该对象并生成一个String 假设我有一个InputStream包含文本数据 我想将其转换为String 例如我可以将其写入日志文件 最简单的方法是什么InputStre
  • 什么会导致“IO错误java.net.SocketException:选择失败”?

    我的笔记本电脑上运行一个服务器程序 相同的路由器和相同的代码 它工作正常 客户端可以连接 然而 当我将工作区复制到我的电脑并运行它时 我得到了这样的废话 IO错误java net SocketException 选择失败 这是代码 publ
  • Golang 从管道读取读取大量数据

    我正在尝试读取一个正在被焦油化 流式传输到标准输入的存档 但我正在以某种方式读取far管道中的数据多于 tar 发送的数据 我像这样运行我的命令 tar cf somefolder my go binary 源代码是这样的 package
  • 信号处理程序内的格式化 I/O

    我想编写一个 SIGSEGV 处理程序 将消息写入文件 FILE 我听说 fprintf 不可重入 不应在信号处理程序内调用 是否有它的可重入版本 或者任何其他提供可以在信号处理程序内部调用的格式化文件 I O 的函数 否 根据C11标准N
  • 谁能解释一下 GHC 对 IO 的定义吗?

    标题非常自我描述 但有一个部分引起了我的注意 newtype IO a IO State RealWorld gt State RealWorld a 剥离newtype 我们得到 State RealWorld gt State Real
  • Fortran DLL 导入

    Fortran 中有一段代码罗伯特 L 帕克和菲利普 B 斯塔克 http www stat berkeley edu 7Estark Code sbvq f FORTRAN subroutine bv key m n a b bl bu
  • 在没有 paramiko 的情况下通过 python 运行 ssh 时,“伪终端不会被分配,因为 stdin 不是终端”

    我在 Python 中运行 ssh 而不使用像 Paramiko 这样的外部库 我这样做有我的理由 而不是通过外部库 基本上我正在做subprocess Popen ssh t bla command 执行此操作时我收到以下消息 Pseud
  • 在 haskell 中处理 IO 与纯代码

    我正在编写一个shell脚本 我在haskell中的第一个非示例 它应该列出一个目录 获取每个文件大小 进行一些字符串操作 纯代码 然后重命名一些文件 我不确定我做错了什么 所以有两个问题 我应该如何安排这样的程序中的代码 我有一个具体问题
  • 使用 Fortran 90 正确读取输入文件中的注释行

    据我了解 Fortran 在从文件读取数据时 会跳过以星号 开头的行 假设它们是注释 好吧 我似乎在用我创建的一个非常简单的程序实现这种行为时遇到了问题 这是我的简单 Fortran 程序 1 program test 2 3 intege
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • Java 定期挂在 futex 且 IO 输出非常低

    目前我的应用程序周期性地阻塞IO 并且输出非常低 我使用一些命令来跟踪该过程 通过使用jstack我发现该应用程序挂在 FileOutputStream writeBytes 处 通过使用strace f c p pid为了收集系统调用信息
  • 如何复制文件并具有取消复制的功能?

    我正在努力拥有program能够取消复制 因此我不能使用Microsoft VisualBasic FileIO FileSystem CopyFile 有一些包装用于CopyFileEx在网络上 例如here http msdn micr
  • 使用Java修改文件内容

    我想使用java程序删除文件的一些内容 如下所示 这是在同一文件中替换的写入方法还是应该将其复制到另一个文件中 但它删除了文件的所有内容 class FileReplace ArrayList
  • 如何在上一级目录创建文件?

    如何在 python 上一级目录中创建文件 而不使用完整路径 我想要一种既适用于Windows又适用于Linux的方法 Thanks Use os pardir 这可能总是 import os fobj open os path join
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了

随机推荐

  • jq 是否已安装并在 PATH 上可用?

    我正在尝试读取 gitlab CI 中的 yaml 文件 我安装了jq 1 0 2 and yq 2 10 1 using pip在我的 CI 工作中 我使用 python 3 7 图像 当我尝试读取 yaml 文件时 出现错误 yq Er
  • 如何为 S3 对象创建 java OutputStream 并向其写入值?

    使用 AmazonS3 类中的方法将内容添加到 S3 文件的现有方法有 通过带有输入流的 putObject 创建包含内容的本地文件并将其上传到 S3 有没有办法为现有的 S3 对象创建一个 OutputStream 可以将列表中的值写入其
  • 当 SCREEN_ON 接收器被触发时,如何禁用键盘防护并向用户显示活动?

    当 screen on 激活广播接收器时 如何禁用键盘保护 以便当它发生时用户可以看到我在其后面启动的活动 活动已经开始 我一直在尝试从屏幕关闭触发的广播接收器中执行以下代码 KeyguardManager myKeyGuard Keygu
  • .NET 正则表达式中的 \d 与 [0-9] [重复]

    这个问题在这里已经有答案了 我经常看到 0 9 用于 Stack Overflow 上的 NET 正则表达式答案 而不是 d 我问过为什么 答案往往是 d匹配的不仅仅是 0 9 那么它还匹配什么呢 这张表说它匹配十进制数字 那么呢 p Nd
  • Maven 安装插件:参数文件丢失或无效

    我有一个本地 jar 我想在我的项目中使用它 有很多方法可以做到这一点 只需手动安装到本地存储库中 使用父 pom 中的脚本进行安装 使用系统范围 使用本地存储库声明 我决定使用 Maven Install 插件将 jar 安装到存储库中
  • gcc 编译标志

    谁能解释一下为什么我们在 gcc 中使用 m 标志 我运行 man gcc 命令结果很不清楚 任何人都可以解释一下这个标志在编译中的作用吗 如何使用 m 标记其正确的语法 我需要它 因为我正在通过 make 命令运行自动生成的 makefi
  • Web API ModelBinders - 如何以不同方式绑定对象的一个​​属性

    我有以下操作签名 ValidateInput false public HttpResponseMessage PostParam Param param Param 看起来像这样 public class Param public int
  • 非静态方法 PEAR::isError() 不应静态调用

    从 RHEL 5x 升级到 CentOS 6x 后 我开始在 httpd 日志中看到以下错误 PHP 严格标准 非静态方法 PEAR isError 不应该 在 web sites blah somescript php 第 33 行静态调
  • 为什么 strncpy 被标记为不安全?

    我收到警告 warning C4996 strncpy This function or variable may be unsafe Consider using strncpy s instead To disable deprecat
  • 如何有选择地合并或选择 Git 中另一个分支的更改?

    我正在一个新项目上使用 Git 该项目有两个并行的 但目前是实验性的 开发分支 master 导入现有代码库以及我通常确定的一些修改 exp1 实验分支 1 exp2 实验分支 2 exp1 and exp2代表了两种截然不同的架构方法 在
  • 为什么 byte += 1 可以编译,而 byte = byte + 1 不能编译?

    如果我有一个字节变量 byte b 0 为什么以下工作有效 b b 1 compiles 但这不 b b 1 compile error 编译器首先理解为byte第二个是int EDIT 我知道选角 但我想提请你注意b b 1 and b
  • 如何在Flutter中使用Dart http包指向localhost:8000?

    我正在关注Flutter 网络 HTTP 教程向在我的 localhost 8000 上运行的服务器发出 GET 请求 通过浏览器访问我的本地主机工作正常 我的代码如下所示 var url http localhost 8000 Futur
  • 如何将 puppeteer-core 与 electro 结合使用?

    我从另一个 Stackoverflow 问题中得到了这段代码 import electron from electron import puppeteer from puppeteer core const delay ms number
  • max_input_vars 设置即使在 php.ini 中注释

    我的 PHP 应用程序有一个奇怪的问题 在我的 php ini 中 我已经注释掉了max input vars指令 但是当提交 1 2k 表单时 我知道它有点大 最后 200 个帖子值被截断 奇怪的是我什至重新启动了我的 Apache 我的
  • 不同 .config 文件上的 AppSettings 未更新

    我正在尝试做与最近提到的完全相同的事情上一个问题 本质上 情况是这样的 这与我的情况完全相同 我的计划是拥有这些 appSettings 在他们自己的文件 Settings config 中 我将授予修改权 Web进程用户的权限 帐户 并存
  • 在 C++ 中将数组的所有元素初始化为一个默认值?

    C 笔记 数组初始化有一个关于数组初始化的很好的列表 我有一个 int array 100 1 期望它充满 1 但事实并非如此 只有第一个值是 其余的都是 0 与随机值混合 The code int array 100 0 工作正常并将每个
  • android 在同一个活动中添加两个工具栏?

    我有一个底部菜单作为工具栏 我需要在顶部添加另一个菜单作为操作栏 这是活动的代码 public class ListViewPharms extends AppCompatActivity public Toolbar mToolbar L
  • hibernate复合主键包含复合外键,如何映射这个

    我在那里搜索 没有找到任何类似的主题 所以我发布了一个新问题 我正在现有数据库上使用 Hibernate 我们不允许更改表结构和数据 应用程序从数据库读取数据并根据某种逻辑迁移到另一个数据存储 现在的问题是关于复合 PK 映射 例如 表 A
  • Flux 未在 Spring 5 Reactor 中订阅

    我可能错过了一些东西 但我不知道它是什么 下面的代码什么也不做 webClient get uri some path here retrieve bodyToMono GetLocationsResponse class doOnNext
  • 如何获取充当 stdin/stdout 的文件的名称?

    我遇到以下问题 我想用 Fortran90 编写一个程序 我希望能够像这样调用 program x lt main in gt main out 除了 main out 我可以在调用程序时设置其名称 之外 还必须编写辅助输出 我希望它们具有