如果它们同时执行,如何从另一个可执行文件访问变量?
how to access a variable from another executable if they are executed at the same time?
我有两个不同的可执行文件,分别称为 main1 和 main2。在第一个 main1 中,我输入了 int main(int argc, char **argv)
个参数。我想将它们发送到 main2,我将检查输入并显示它们。但问题是我需要同时执行它们,分别在 Iterm 中,如:
./main1 "asd" | ./main2
是不是应该用malloc存到内存里,再从另一个main调用?如果是这样我该怎么做?
我无法改变执行它们的方式。我所能做的就是创建我的库或分配内存。
根本不能用malloc
malloc 在当前程序的堆上分配内存,但 "main1" 的内存不与 "main2" 的内存共享,因此您无法按他的方式访问它。
这是一件很奇怪的事情,但是如果你真的需要在不使用参数的情况下将 "asd" 字符串传递给 main2,我建议你寻找 IPC,更准确地说,共享内存。
这将允许您声明计算机上 public 的一部分内存,任何进程都可以访问它。
但是请注意,此内存本身并没有防止多次访问,您需要使用信号量(共享内存互斥锁)。
您可以查看此 post 的答案,了解如何执行此操作的基本示例(即使它适用于分叉而不是 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
在此 shell 语句中
./main1 "asd" | ./main2
管道符号 (|
) 将其左侧参数的标准输出连接到其右侧参数的标准输入。
所以要从 main1
发送数据到 main2
只需让 main1
写入预先打开的 FILE*
stdout
并让 main2
从预开的FILE*
stdin
读取。 "pre-opened" 指的是这两个流在 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);
}
我有两个不同的可执行文件,分别称为 main1 和 main2。在第一个 main1 中,我输入了 int main(int argc, char **argv)
个参数。我想将它们发送到 main2,我将检查输入并显示它们。但问题是我需要同时执行它们,分别在 Iterm 中,如:
./main1 "asd" | ./main2
是不是应该用malloc存到内存里,再从另一个main调用?如果是这样我该怎么做? 我无法改变执行它们的方式。我所能做的就是创建我的库或分配内存。
根本不能用malloc
malloc 在当前程序的堆上分配内存,但 "main1" 的内存不与 "main2" 的内存共享,因此您无法按他的方式访问它。
这是一件很奇怪的事情,但是如果你真的需要在不使用参数的情况下将 "asd" 字符串传递给 main2,我建议你寻找 IPC,更准确地说,共享内存。 这将允许您声明计算机上 public 的一部分内存,任何进程都可以访问它。
但是请注意,此内存本身并没有防止多次访问,您需要使用信号量(共享内存互斥锁)。
您可以查看此 post 的答案,了解如何执行此操作的基本示例(即使它适用于分叉而不是 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
在此 shell 语句中
./main1 "asd" | ./main2
管道符号 (|
) 将其左侧参数的标准输出连接到其右侧参数的标准输入。
所以要从 main1
发送数据到 main2
只需让 main1
写入预先打开的 FILE*
stdout
并让 main2
从预开的FILE*
stdin
读取。 "pre-opened" 指的是这两个流在 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);
}