我有两个不同的可执行文件,分别称为main1和main2。 在第一个 main1 中,我有int main(int argc, char **argv)
个参数,我接受了输入。 我想将它们发送到main2,我将检查输入并显示它们。 但问题是我需要同时执行它们,分别在 Iterm 中执行它们,例如:
./main1 "asd" | ./main2
我应该使用 malloc 将其存储在内存中并从另一个主服务器调用它吗? 如果是这样,我该怎么做? 我无法改变我执行它们的方式。我所能做的就是创建我的库或分配内存。
在此 shell 语句中
./main1 "asd" | ./main2
管道符号(|
)将其左侧参数的标准输出连接到其右侧参数的标准输入。
因此,要将数据从main1
发送到main2
只需让main1
写入预打开的FILE*
stdout
,并main2
从预打开的FILE*
stdin
中读取。"预打开"是指当 C 程序启动时,这两个流由 C 运行时系统自动打开。
要访问main1
内部传递的参数main1
请像这样定义其main()
int main(int argc char ** argv)
并做
for (int i = 1; i < argv; ++i)
{
/* to for example print the arguments (to standard-output) do: */
fputs(argv[i], stdout);
}
你根本不能使用 malloc。
Malloc 在当前程序的堆上分配内存,但 "main1" 的内存不与 "main2" 的内存共享,因此您无法以他的方式访问它。
这是一件很奇怪的事情,但是如果您真的需要使用参数将"asd"字符串传递给main2,我建议您寻找IPC,更准确地说,共享内存。 这将允许您声明将在计算机上公开的内存部分,并且任何进程都可以访问它。
但请注意,此内存本身不受多次访问保护,您需要使用信号量(共享内存互斥锁)。
您可以查看这篇文章的答案以获取有关如何执行此操作的基本示例(即使它适用于 forks 而不是 2 个不同的进程,它仍然是相同的用例)
如果你想看看你在做什么,在测试时,因为这些内存块是计算机范围的(而不仅仅是计算机),你有办法通过终端观察它们。我建议您阅读此手册页并尝试自己 http://man7.org/linux/man-pages/man1/ipcs.1.html
最后,如果您总是这样启动程序,那么使用管道也可能很好;)
如果我正确理解了您的要求,那么它如下:您希望 main1 的输出作为 main2 的输入,对吗?
如果是上述情况,那么您使用的管道操作员完全按照您的要求执行,它将 main1 的输出重定向到 main2 的输入
如果你想重用输入,那么你可以使用 bash 脚本来获取公共输入。稍后您可以使用这些公共输入来调用所需不同程序的任意数量的main()
函数。 这只是一种可能的解决方案。这可能不适用于您的情况。
参考资料 - https://unix.stackexchange.com/questions/89332/how-to-run-more-than-one-program-in-a-single-script