【问题标题】:How to get stdin in C to read external data from another program? [closed]如何让 C 中的标准输入从另一个程序中读取外部数据? [关闭]
【发布时间】:2021-01-31 13:49:30
【问题描述】:

此问题已关闭,消息指示我对其进行编辑或删除,并可能发布一个新问题;但是,系统不允许我删除它,并表示其他人付出了太多努力才能将其删除。

没关系。如果有兴趣,@jfs 在评论here 中提供了答案。 我很欣赏这篇文章中的 cmets 和答案,但应该指出浏览器可以仅通过本机消息传递 API 与 C 程序交换消息。除了此MDN document 和此MDN document 中提供的特定于操作系统的设置说明之外,开发人员不需要其他任何内容。尽管我的 C 问题很新手,但即使我也完成了这部分工作。

谢谢。


我正在尝试在浏览器扩展程序和本机 c 程序之间设置本机消息传递。我很确定我了解扩展方面并准备好进行测试;但自从 Borland Turbo C 流行以来,我就没有使用过 C。

能否请您指出有关如何使用 C 中的 stdinstdout 从浏览器接收和发布消息的信息?我确定我只是在寻找错误的地方,但我遇到的所有内容都与键盘和文件有关,而不是来自另一个程序的输入。我认为我可以在获得信息后对其进行操作,但我被困在相当于设置通信端口侦听器的第一步。

谢谢。


我想在 C# 中完成类似 this 之类的操作,但对于 public static JObject Read() 中的以下代码,我不遵循 C 中的等效项:

var stdin = Console.OpenStandardInput();
var lengthBytes = new byte[4];
stdin.Read(lengthBytes, 0, 4);

This 问题类似于正在发生的事情。浏览器就像这张海报的 Java 程序一样,它打开 C 程序并传递数据。我只是对stdin 是否必须从键盘重定向到与此数据传递相关的内容感到困惑,或者它是否只会拾取发送给它的任何数据。而且,键盘输入怎么在这期间没有被拾起?

【问题讨论】:

  • 无论输入来自何处,您都从 C 中的文件中读取。stdin 是标准文件号 0。你可以使用面向字符的输入getchar()fgetc()等,你可以使用面向行的输入、fgets()或POSIX getline(),或者您可以使用格式化输入,例如scanf()fscanf()。 (虽然在这里您最好使用fgets() 阅读,然后使用sscanf() 解析缓冲区中的值)如果它是二进制数据,那么您将使用fread() 或较低级别的系统调用read(),区别在于无论您使用的是文件流还是文件描述符。
  • 为了补全,stdout 是对应于标准文件号1stderr 文件号2 的流。从文件描述符的角度来看,它是STDIN_FILENOSTDOUT_FILENOSTDERR_FILENO
  • 谢谢。我阅读了这些方法并在其他输入上尝试了它们,但肯定遗漏了一些明显的东西。所有的例子和我的书都是从打开一个文件开始阅读的。我错过了如何从浏览器消息中获取与输入相关联的标准文件编号 0?
  • edit 提供更多详细信息:什么计算机、什么操作系统、什么 C 编译器。在您的问题中还提供一些minimal reproducible example
  • @Basile Starynkevitch 我想这样做,但使用 C 而不是 C#。 stackoverflow.com/questions/30880709/…,但我不明白stdin 将如何阅读传入的消息,但我想我现在明白了。

标签: c stdin


【解决方案1】:

我正在尝试在浏览器扩展和原生 c 程序之间设置原生消息传递

AC 程序不与浏览器交互(例如,在 Arduino 上运行的 C 程序不会,Linux kernel 有时不会,而我的 computer mouse 内的 C 程序不会)。

如果您想编写与某些网络浏览器交互的程序,请阅读 CGIFastCGIHTTP

阅读有关 C 编程语言的更多信息,例如Modern C 然后是 C11 草案标准 n1570

一些操作系统(例如POSIXLinux)上,您可以使用HTTP服务器库,例如libonion(对于Linux,另请参阅syscalls(2)... )。但如果您使用 Windows,请阅读其documentation

阅读 C 编译器(例如 GCC)和调试器(例如 GDB)的文档。考虑使用Frama-CClang static analyzer 等静态分析工具。

在 Linux 上,您可能需要阅读 socket(7)tcp(7) 并考虑使用 popen(3) 和/或 dlopen(3)。然后阅读Advanced Linux Programmingsyscalls(2)

FreeBSD 上,情况略有不同。在 Windows 上,情况非常不同,IBM/Series ZOpenVMSGNU HurdL4Plan9 也是如此。另请阅读this PhD thesis 了解外核,并参阅this list 开源操作系统。

您可能想阅读一些textbook about operating systems

当然,一些浏览器——尤其是firefox——(大部分)是用 C++ 编码的(有些部分是用Rust 编码的)。你甚至可以下载它的source 代码(因为Firefox 是open source)。该代码使用operating system 特定APIs。

【讨论】:

  • 你确定这个方法在原生应用程序中不起作用吗?是用C写的? developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/…
  • @Gary:不,我不确定,因为我不是以英语为母语的人,我不明白您所说的“本地应用程序”是什么意思。 n1570 不要提及他们。
  • 我明白了。我的意思是安装在用户计算机上的程序。该 Mozilla 文档中有一个语言下拉菜单,但我不知道它是否会包含您的母语。目标是让扩展与本地安装的程序通信。该文档没有提到本机消息传递 API 不能与 C 程序一起使用,尽管示例使用 Python 和 node.js。我对此知之甚少,但有一些问题是使用 C# 完成的。感谢所有链接。
  • 如果用户的计算机运行 Android、Windows、FreeBSD 或 Linux,情况就非常不同了。如果是top500 超级计算机,情况就更不一样了。 AFAIK,超级计算机不运行浏览器。
  • 我是个新手,我确信您提供的链接远远超出了我的能力范围。我不是想变得粗鲁,但我不确定你以为我问了什么。 C 程序可以与浏览器交互。或许我们对“交互”有不同的理解。尽管如此,浏览器提供了一个原生消息 API,正如我在上面的第一条评论中所链接的那样。 @jfs 为我提供了我难以理解的信息,并且它有效。请参阅stackoverflow.com/questions/64400254/…
猜你喜欢
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
相关资源
最近更新 更多