[英]In C, is there a way to pass a return value of one program to another program?
因为我是 C 新手,所以我有 2 个基本问题:
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);
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()
子进程。
如果在本例中杀死父进程,子进程也将被杀死。 这可能是也可能不是你想要的。
其他方法(有些比其他方法好得多):
我相信还有很多其他方法; 但是,当您有两个程序合作解决一个问题时,您会开始遇到很多问题,而这些问题通常在只考虑一个程序解决问题时不会遇到。
需要考虑的一些事项:
通信是可靠的——文件、套接字、网络等有时都会失败。 您需要验证您的发送是否已发送,并提供一些方法来了解您的数据没有因传输而损坏。
通信行为需要时间——您需要处理传输的打包、插入、检索和拆包过程中的延迟; 并且,对于每条消息,这些延迟通常会发生巨大变化。
可以处理的消息数量是有限的——传输需要时间,时间意味着传输速率。 由于涉及到速率,您不能设计一个忽略通信路径限制的工作程序。
消息可能被破坏或窃听 - 虽然我们认为计算机永远不会出错,但当数据中的通信错误更频繁地发生时。 这可能是由于很多原因(人们使用 telnet 测试套接字、对网络的电气干扰、管道文件被删除等)此外,数据本身更容易被其他人读取,这对某些程序来说是一个问题。
传输方式发生变化 - 即使您使用文件而不是网络来传输信息,管理员也可以移动文件并插入符号链接。 网络可以通过不同的路径发送每一位信息。 不要假设静态路径。
您无法提供避免关键问题的说明 - 没有计算机只有一个管理员,即使它是您自己的个人计算机。 自动化系统和子程序以及其他人确保您永远无法向所有合适的人提供有关如何解决问题的说明。 编写您的解决方案,避免需要由遵循自定义“必需”程序的人员实施的变通方法。
移动数据不是免费的——它需要时间、电力、RAM、CPU,可能还有磁盘或网络。 即使解决方案的所有其他部分都是正确的,这些成本也会增加(如果不加以管理)以阻止您的程序运行。
数据的传输通常不是同质的 - 一旦您承诺采用一种信息交流方式,很可能不容易用另一种方式轻松替换它。 许多解决方案提供了其他方法中不存在的附加功能,即使您决定使用“仅网络”传输,网络之间的差异也可能使您的解决方案不像您想象的那样通用。
有了这些认识,您就可以更轻松地创建一个有效的解决方案,并且在一些微小的细节发生变化时不会崩溃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.