【发布时间】:2021-01-11 01:40:05
【问题描述】:
自从我是 C 的新人以来,我有 2 个基本问题:
- 如何将 C 程序的返回值传递给另一个程序? prog1 将列出项目(每次执行时项目的数量可能会有所不同),我想只存储最后一个项目值并将其传递给另一个 prog2 以用于不同的目的。基本上 prog1 的输出在下面,我想提取列表中的最后一项,即 prog2 的 /dev/hidraw2。 Prog2 目前正在使用硬编码值,我想让它更具动态性。
prog1 输出:
/dev/hidraw0
/dev/hidraw1
/dev/hidraw2
prog1 代码可以在这里找到:
https://pastebin.pl/view/379db296
prog2 代码 sn-p 如下:
/* 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,我可以直接将 prog1 合并到 prog2 中,即使它们具有不同的编译参数?您认为那里有什么问题吗?
prog1 编译命令:
gcc -Wall -g -o prog1 prog1.c -ludev
prog2 编译命令:
gcc prog2 prog2.c
【问题讨论】:
-
在不修改 prog1 的情况下,我相信您的 prog2 必须通过生成一个进程并读取输出来运行 prog1...我建议您看看这个:geeksforgeeks.org/named-pipe-fifo-example-c-program
-
你真的需要让 prog2 运行 prog1 吗?根据您运行它的方式以及您使用的 OS/shell,最简单的解决方案可能是更新 prog2 以从标准输入读取它的输入,然后使用类似
./prog1 | tail -n 1 | ./prog2的东西运行它(其中tail -n 1是限制到最后一行,这样 prog2 就不需要这样做了)。 -
它们真的必须是单独的程序吗?
-
C不知道IPC的概念。许多使用 C 的平台没有 IPC 或进程的概念。对于类似 unix 的操作系统,我建议使用套接字或通过 @EdmCoff 建议的
stdout/stdin管道 -
编译标志对于组合它们并不是真正的问题。我建议您启用所有不想显式禁用的警告(使用
-Wall -Wextra -Wpedantic)。链接库不是问题 (-ludev)。调试器信息对两者都不是问题,使用它(-g)。
标签: c function cross-compiling hid libudev