我在玩ampersand “&”
。我了解在bash shell脚本中
“&”符号用于派生进程,但将在后台运行。这是有用的,因为它可以让你获得提示立即,并在后台运行的进程。
请遵守以下代码:
#include <stdio.h>
#include <unistd.h>
int x=5;
void main()
{
int pid = getpid();
int y=6;
printf("[%d] [%p] x = %d\n", pid, &x, x++);
printf("[%d] [%p] y = %d\n", pid, &y, y++);
}
成功编译后,我使用以下代码运行代码:
> ./a.out & ./a.out & ./a.out
第一次运行的输出:
[4436] [0x601058] x = 5
[4435] [0x601058] x = 5
[4436] [0x7fff2d481bd8] y = 6
[4435] [0x7fff7ecadd88] y = 6
[4437] [0x601058] x = 5
[4437] [0x7fff6e0741d8] y = 6
第二次运行的输出:
[4469] [0x601058] x = 5
[4469] [0x7fffa00048b8] y = 6
[4470] [0x601058] x = 5
[4470] [0x7fffd447a798] y = 6
[4468] [0x601058] x = 5
[4468] [0x7fffc35dc7b8] y = 6
观察结果:
这是我的问题:
每个进程在虚拟内存中都有自己的地址空间(这要归功于处理器的MMU)。因此,变量对于您的3个过程而言不是全局的;每个过程都有自己的; 因此,过程4436中的地址0x601058(的打印地址)与过程4435中的“相同”地址0x601058不同。x
x
x
因此(虚拟)内存特定于每个进程。进程可以使用mmap(2)更改其地址空间。您可以使用一些高级技术在多个进程之间设置一些共享内存(但之前需要学习一些Linux编程)。参见shm_overview(7)和sem_overview(7)。由于同步问题,您(作为新手)不应使用共享内存。
阅读Advanced Linux Programming,其中有几章与您的问题有关。
多线程进程具有共享相同地址空间(以及其他类似当前目录,打开的文件描述符等)的多个线程。另请阅读POSIX线程(又名pthread)教程。每个线程都有其自己的调用堆栈。
请注意,由于ASLR,从一次运行到下一次运行可能无法复制地址。
在Linux内核中有一个调度的工作任务。计划任务是线程或(单线程)进程。调度程序可能会在任意时刻抢占任务,并且在多核处理器上,您可能有多个并行运行的任务(在不同的内核上)。
您也可以在proc(5)上玩(在Linux上)。如果让进程进入睡眠状态(例如10秒),则可以在cat /proc/4436/maps
进程4436仍在运行(或处于睡眠状态)时键入(例如,在其他终端中)。
您可能还会使用strace(1),或者尝试strace a.out
查看相关的syscalls(2)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句