我正在编写一个shell,我正在调用一个c函数,我在其中导出一个变量。在下面的例子中
my_test.c
int main()
{
setenv("MY_NAME","kk_rathor",1);
// get and print MY_NAME works here
}
my_test_Sh.sh
#!bin/sh
test
echo $MY_NAME // does not works here
我在打印$ MY_NAME时没有得到我的名字但是如果我在shell中导出任何内容我可以在test.c上获取它。
从test.c导出的变量范围是否仅在该函数中。如果不是那么我做错了什么?
由于 如果问题不明确,请告诉我。
答案 0 :(得分:2)
环境变量是当前进程的本地变量,并在创建上传播(=复制)到子进程。当你在C程序中设置MY_NAME
时,它只是在它的进程中被设置,它不能传播到父程序(即shell)。
如果要向shell提供一些数据,请将其写入标准输出。
答案 1 :(得分:2)
了解getenv(3)和setenv(3)以及putenv(3)
但是环境变量(实际上,整个virtual address space和进程状态)是process的本地(例如你的shell),更改它不会影响其他进程中的那些(除了 future) 使用fork(2)获得的子进程。因此,在子进程中更改环境变量 - 或任何其他内存位置,或working directory或file descriptors等等 - 不会影响其父进程(或任何其他现有进程)一)。另请参阅fork(2)和execve(2)。
您应该考虑其他类型的inter-process communication,例如pipe(7) - s或socket(7) - s(以及可能shm_overview(7)和sem_overview(7))。您可能希望event loop以上poll(2)。
阅读intro(2),syscalls(2)和一些类似ALP的书。
顺便说一句,大多数现有Unix shells都是free software。因此,您可以下载并研究他们的源代码。你可以strace(1)他们。另请参阅this。