不同进程可以调用同一个函数吗
c语言吧
全部回复
仅看楼主
level 1
tianyuanjin 楼主
我看书上说的,因为不同进程的物理内存是互相独立的,所以无论函数是否可重入,进程都可以调用他们
这个是具体是为什么呢,比如有个func(),里面有个全局变量global_a,进程A调用func()然后访问global_a,然后切换到进程B调用func()访问global_a,这个为啥不会出现问题呢,难道有2个global_a分别在A进程的数据区和B进程的数据区?
2024年12月16日 11点12分 1
level 14
每个进程的堆栈都是独立的
2024年12月16日 11点12分 2
全局变量不在堆栈区吧[乖]
2024年12月17日 02点12分
@tianyuanjin linux内存模型一般都是堆,栈,文件映射区,.data,.bss段还有.text段,全局变量都根据是否初始化的分别放置在.data和.bss段,
2024年12月17日 05点12分
@tianyuanjin VC确实有一个自定义扩展,可用来定义在不同进程实例之间共享的全局变量;除此之外,各个操作系统也都有一些特殊的内存分配方法,用来创建共享内存。再不然,你可以用DOS系统,不过它反正只能运行一个进程。
2024年12月17日 09点12分
@tianyuanjin 就算Windows 3.0那样的系统,它的每个进程也是各有自己的内存的,只不过这些进程彼此没有隔离,有可能利用越界指针来访问任何进程,甚至操作系统内存。
2024年12月17日 09点12分
吧务
level 14
这个问题就好比“两个班上可以有同样叫张三的两个人吗?”答案是当然可以。不同进程中的函数彼此无关。
函数的可重入性是另一个概念,在linux中指的是函数在任意时刻被中断后,中断处理程序再次进入同一个函数,函数的逻辑是否能保证正确。
2024年12月16日 13点12分 5
@tianyuanjin 动态链接库的代码段在进程间共享,数据段不共享。
2024年12月17日 04点12分
我看书上讲的是,函数有全局变量就不可重入,但是不同进程调用不可重入函数不会有影响,这是为啥呢。。这个全局变量难道说在AB进程中是不同的全局变量嘛
2024年12月17日 02点12分
回复 tianyuanjin :当然是的。
2024年12月17日 02点12分
@GTA小鸡 咦 我有个问题,如果是动态链接的话,因为动态链接库是个可重定位文件嘛,在动态库里面实现func(),里面的全局变量应该在动态库的数据段吧?为啥不同进程不共享这个动态库的全局变量呢?
2024年12月17日 03点12分
level 12
在linux系统中,使用fork创建的进程是原进程的副本,即使是全局变量,在副本中也会有一个相同的副本。这样每个进程都可以在自己的地址空间中独立运行。
2024年12月17日 00点12分 6
那这个意思是,进程A修改了func()里面的全局变量,进程B调用func()时就没有影响?这个func()代码应该是处于共享内存吧,里面的全局变量不共享吗?
2024年12月17日 02点12分
@tianyuanjin 不共享。
2024年12月19日 01点12分
@tianyuanjin 我一会在给你个例子。
2024年12月19日 02点12分
level 1
你说的是全局变量对同一个进程不同线程的影响吧。不同进程全局变量不受影响
2024年12月17日 03点12分 7
level 15
“动态链接库”[滑稽]
2024年12月17日 05点12分 8
level 7
宏观上并行,微观上串行,肯定能。
2024年12月17日 06点12分 9
level 5
[滑稽]有可能多个进程会调用同一个函数的二进制,比如调用某些系统公用库,我记得类linux的ui foundation库应该就是这样
2024年12月17日 06点12分 10
level 11
正常情况下,一个dll被两个进程加载,内存是完全独立的,所以变量也是各自使用自己的副本。如果要两个进程共享这个变量,需要设置一个共享节,然后把变量放这个节里面。
2024年12月17日 07点12分 11
level 10
全局变量在静态区,不是堆栈区,只有一份
2024年12月17日 08点12分 12
level 1
tianyuanjin 楼主
感谢楼上佬们的解答[呵呵]
人已经学晕了[揉脸]
2024年12月17日 08点12分 13
[喷]本科学的操作系统还是选修课,甚至不涉及代码,现在工作了感觉就啥也不懂。我还是在windows上写C,我都不知道进程线程有啥区别(虽然百度能查到定义,不过我不知道在代码里面这俩有啥区别),我之前看别人FreeRTOS的课,就看调用TaskCreate创建任务,也不知道算是线程还是进程[啊]
2024年12月17日 09点12分
回复 tianyuanjin :计算机操作系统是必修课吧[疑问][疑问][疑问]
2024年12月18日 08点12分
@没有钱的货 我是信息工程专业的
2024年12月19日 03点12分
level 8
你应该补一下,c文件h文件经过一系列的预编译编译汇编链接生成的可执行文件,以及装载和执行。调用函数仅仅跳转过去,只不过这样访问全局变量有风险,毕竟有个读改写的过程。
2024年12月17日 09点12分 14
确实 以前上课没这么细,现在学就感觉东西很多,常看常新
2024年12月17日 11点12分
level 11
DLL你说啥[阴险][阴险]
2024年12月18日 20点12分 15
具体细节不是很懂,只在书上看了些基本的原理
2024年12月19日 03点12分
level 12
2024年12月19日 02点12分 16
感谢大佬,很直观[酷]不过我还得研究下,没用过fork()函数,最近看了些多任务编程的理论知识。话说没看到main里面有调度相关的内容呀
2024年12月19日 03点12分
level 11
肯定可以啊,看看win/linux的库就知道,都是直接调用的
2024年12月19日 02点12分 17
1 2 尾页