繁体   English   中英

在 C 中,有没有办法将一个程序的返回值传递给另一个程序?

[英]In C, is there a way to pass a return value of one program to another program?

因为我是 C 新手,所以我有 2 个基本问题:

  1. 如何将 C 程序的返回值传递给另一个程序? prog1 将列出项目(项目数量可以在每次执行时改变),我只想存储最后一个项目值并将其传递给另一个 prog2 以用于不同的目的。 基本上prog1的输出在下面,我想提取列表中的最后一项,即prog2的/dev/hidraw2。 Prog2 目前正在使用硬编码值,我想让它更加动态。

prog1 输出:

/dev/hidraw0
/dev/hidraw1
/dev/hidraw2

prog1 代码可以在这里找到:

https://pastebin.pl/view/379db296

prog2 代码片段如下:

/* C */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

const char *bus_str(int bus);

int main(int argc, char **argv)
{
        int fd;
        int i, res, desc_size = 0;
        char buf[256];
        struct hidraw_report_descriptor rpt_desc;
        struct hidraw_devinfo info;
        char *device = "/dev/hidraw2";   /*** replace hardcoded value here dynamically ***/

        if (argc > 1)
                device = argv[1];

        /* Open the Device with non-blocking reads. In real life,
           don't use a hard coded path; use libudev instead. */
        fd = open(device, O_RDWR);
  1. 如果上面的问题 1 解决了,即使它们具有不同的编译参数,我是否可以直接将 prog1 合并到 prog2 中? 你预见到那里有什么问题吗?

prog1 编译命令:
gcc -Wall -g -o prog1 prog1.c -ludev

prog2 编译命令:
gcc prog2 prog2.c

一种方法,并且有很多,是使用 fork。 fork()与其他 C 函数调用有点不同。 当你调用它时,你会得到一个正在运行的进程的额外副本。 然后,您可以比较返回值以确定哪个进程是父进程,哪个进程是子进程。

整个逻辑看起来有点像:

while (looping) {
   char device[] = (set to the desired value);
   int childPID = fork();
   if (childPID == 0) {
       /* this is the child */
       doWhatever(device);
       exit(0);
   } else {
       /* this is the parent */
       /* let's wait on the child to complete */
       wait();           
   }

现在这个例子非常简单。 还有很多其他的考虑; 但是这种方法避免了在进程之间传递信息的其他更复杂的方法。 基本上,在调用fork()时,子进程被创建为程序的副本,因此device的内容将在两个进程之间共享。

需要注意的一些问题是子进程需要向父进程报告他们的退出代码。 因此,如果您不想一次运行一个进程,则需要一种更复杂的方法来wait()子进程。

如果在本例中杀死父进程,子进程也将被杀死。 这可能是也可能不是你想要的。

其他方法(有些比其他方法好得多):

  1. 使用 IPC 创建基于共享内存和信号量的生产者/消费者模式(以控制谁写入共享内存,因此读取过程不会读取部分写入的条目或删除部分创建问题的项目。
  2. 使用上述方法(fork),但在子进程读取的模式中创建一个未命名的管道。 这可以允许孩子处理多个请求。
  3. 使用独立于两个程序存在的命名管道(一种非常特殊的文件)。 这允许独立启动孩子。
  4. 使用由生产者编写并由消费者读取的常规文件。 这将需要某种信号,指示文件何时可以安全写入(因此消费者不会读取错误)以及文件何时可以安全读取/缩短(因此写入者不会损坏文件)。

我相信还有很多其他方法; 但是,当您有两个程序合作解决一个问题时,您会开始遇到很多问题,而这些问题通常在只考虑一个程序解决问题时不会遇到。

需要考虑的一些事项:

  1. 通信是可靠的——文件、套接字、网络等有时都会失败。 您需要验证您的发送是否已发送,并提供一些方法来了解您的数据没有因传输而损坏。

  2. 通信行为需要时间——您需要处理传输的打包、插入、检索和拆包过程中的延迟; 并且,对于每条消息,这些延迟通常会发生巨大变化。

  3. 可以处理的消息数量是有限的——传输需要时间,时间意味着传输速率。 由于涉及到速率,您不能设计一个忽略通信路径限制的工作程序。

  4. 消息可能被破坏或窃听 - 虽然我们认为计算机永远不会出错,但当数据中的通信错误更频繁地发生时。 这可能是由于很多原因(人们使用 telnet 测试套接字、对网络的电气干扰、管道文件被删除等)此外,数据本身更容易被其他人读取,这对某些程序来说是一个问题。

  5. 传输方式发生变化 - 即使您使用文件而不是网络来传输信息,管理员也可以移动文件并插入符号链接。 网络可以通过不同的路径发送每一位信息。 不要假设静态路径。

  6. 您无法提供避免关键问题的说明 - 没有计算机只有一个管理员,即使它是您自己的个人计算机。 自动化系统和子程序以及其他人确保您永远无法向所有合适的人提供有关如何解决问题的说明。 编写您的解决方案,避免需要由遵循自定义“必需”程序的人员实施的变通方法。

  7. 移动数据不是免费的——它需要时间、电力、RAM、CPU,可能还有磁盘或网络。 即使解决方案的所有其他部分都是正确的,这些成本也会增加(如果不加以管理)以阻止您的程序运行。

  8. 数据的传输通常不是同质的 - 一旦您承诺采用一种信息交流方式,很可能不容易用另一种方式轻松替换它。 许多解决方案提供了其他方法中不存在的附加功能,即使您决定使用“仅网络”传输,网络之间的差异也可能使您的解决方案不像您想象的那样通用。

有了这些认识,您就可以更轻松地创建一个有效的解决方案,并且在一些微小的细节发生变化时不会崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM