微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C语言中,是否可以将一个程序的返回值传递给另一个程序?

如何解决在C语言中,是否可以将一个程序的返回值传递给另一个程序?

自从我是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. 使用上述方法(叉子),但在儿童随后从中读取的模式中创建一个未命名的管道。这样可以允许孩子处理多个请求。
  3. 使用独立于两个程序而存在的命名管道(一种非常特殊的文件)。这样可以独立发射孩子。
  4. 使用由生产者编写并由消费者读取的常规文件。这将需要某种信号来指示何时可以安全地写入文件(这样,消费者不会受到不良读取)以及何时可以安全地读取/缩短文件(以使编写者不会损坏文件)。

我肯定还有很多其他方法;但是,当您有两个程序合作解决一个问题时,仅考虑一个程序来解决问题便会遇到很多通常没有的问题。

要考虑的一些事情:

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

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

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

  4. 该消息可能已损坏或被窃听-尽管我们希望计算机永远不会出错,但是在数据中进行通信时,错误发生的频率更高。这些可能是由于多种原因(人们使用telnet测试套接字,与网络的电气干扰,删除了管道文件等)。此外,数据本身更容易被其他人读取,这对于某些程序来说是个问题。 / p>

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

  6. 您无法提供避免出现严重问题的说明-即使一台计算机是您自己的个人计算机,也没有任何计算机只有一名管理员。自动化的系统和子例程以及其他人员,确保您永远无法向所有合适的人提供有关如何解决问题的说明。编写解决方案,避免需要人们按照自定义的“必需”过程实施的变通方法。

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

  8. 数据的传输通常不是同质的-一旦您承诺了一种传达信息的方式,很可能很难轻易地用另一种方式来代替它。许多解决方案提供了其他方法所没有的其他功能,即使您决定“仅网络”传输,网络之间的差异也可能使您的解决方案不像您想象的那样通用。

有了这些实现,您就可以轻松创建一个可行的解决方案,并且当一些微小的细节发生变化时也不会崩溃。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。