在c函数中导出的环境变量是否可以在父shell中使用?

时间:2017-11-02 06:19:35

标签: c shell

我正在编写一个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导出的变量范围是否仅在该函数中。如果不是那么我做错了什么?

由于 如果问题不明确,请告诉我。

2 个答案:

答案 0 :(得分:2)

环境变量是当前进程的本地变量,并在创建上传播(=复制)到进程。当你在C程序中设置MY_NAME时,它只是在它的进程中被设置,它不能传播到父程序(即shell)。

如果要向shell提供一些数据,请将其写入标准输出。

答案 1 :(得分:2)

了解getenv(3)setenv(3)以及putenv(3)

但是环境变量(实际上,整个virtual address space和进程状态)是process的本地(例如你的shell),更改它不会影响其他进程中的那些(除了 future) 使用fork(2)获得的子进程。因此,在子进程中更改环境变量 - 或任何其他内存位置,或working directoryfile 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