在视觉上,当您使用&符号调用同一进程时会发生什么

透明金

我在玩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

观察结果:

  • 由于每个进程同时运行,因此某些打印语句的显示顺序不同。
  • 变量x的地址在所有实例上都相同,因为它是全局变量。
  • x的值在所有情况下都是相同的,因为它每次都会重置为5。
  • 变量y仅在main()本地,因此其地址在每个进程中都是唯一的。

这是我的问题:

  1. 某些打印语句以不同顺序出现的原因是由OS调度程序首先启动哪个进程确定的?
  2. 由于变量x是全局变量,因此似乎在所有运行/实例中都保留相同的地址。自动递增后,为什么在进程之间不共享其值?为什么任何进程都不打印x的增量值?
巴西勒·斯塔林凯维奇

每个进程虚拟内存都有自己的地址空间(这要归功于处理器的MMU)。因此,变量对于您的3个过程而言不是全局的每个过程都有自己的; 因此,过程4436中的地址0x601058(的打印地址)与过程4435中的“相同”地址0x601058不同。xxx

因此(虚拟)内存特定于每个进程。进程可以使用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)

当然,请多次阅读fork(2)execve(2)的文档

由于bash shell是免费软件,因此您可以研究其源代码。它确实要求fork很多!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当多个进程尝试写入同一文件时会发生什么?

来自分类Dev

当多个进程尝试写入同一文件时会发生什么?

来自分类Dev

当您调用包含yield的函数时会发生什么?

来自分类Dev

当您使用浏览器返回时会发生什么?

来自分类Dev

当第一个子进程退出,然后父进程退出而不调用wait时会发生什么?

来自分类Dev

当您用尽PID时会发生什么?

来自分类Dev

当两个进程侦听同一个 Berkeley/Unix [file] 套接字时会发生什么?

来自分类Dev

在python中的str上使用encoding时会发生什么?

来自分类Dev

当您从非AD帐户调用UserPrincipal.Current.GivenName时会发生什么?

来自分类Dev

当两个进程同时调用register()时会发生什么

来自分类Dev

在/上安装分区时会发生什么?

来自分类Dev

在/上安装分区时会发生什么?

来自分类Dev

当我混合使用有符号和无符号类型时会发生什么?

来自分类Dev

当我在同一指针中两次使用malloc()时会发生什么?

来自分类Dev

当您在某个进程上按ctrl + z时会发生什么?

来自分类Dev

进程在X服务器上运行时会发生什么变化

来自分类Dev

当您产生一个activerecord对象时会发生什么?

来自分类Dev

当您传递android systemclock.sleep(long)一个负参数时会发生什么

来自分类Dev

使用管道在同一进程上执行多个Shell命令时读取死锁

来自分类Dev

GCM:在多个设备上使用同一帐户-会发生什么?

来自分类Dev

当您使用Task.Run太多而导致线程池耗尽时会发生什么?

来自分类Dev

当您使用多个嵌套作用域时会发生什么?

来自分类Dev

当您使用范围通道中断for语句时会发生什么

来自分类Dev

当您使用jquery更改img标签的src时会发生什么?

来自分类Dev

当您使用“ + =”在Java中“更改”字符串时会发生什么情况?

来自分类Dev

当您使用 select# 作为 css 选择器时会发生什么?

来自分类Dev

当您从《虚无》中抽奖时会发生什么?

来自分类Dev

当您打开/关闭手柄时会发生什么?

来自分类Dev

当您移到非右值参考时会发生什么?

Related 相关文章

  1. 1

    当多个进程尝试写入同一文件时会发生什么?

  2. 2

    当多个进程尝试写入同一文件时会发生什么?

  3. 3

    当您调用包含yield的函数时会发生什么?

  4. 4

    当您使用浏览器返回时会发生什么?

  5. 5

    当第一个子进程退出,然后父进程退出而不调用wait时会发生什么?

  6. 6

    当您用尽PID时会发生什么?

  7. 7

    当两个进程侦听同一个 Berkeley/Unix [file] 套接字时会发生什么?

  8. 8

    在python中的str上使用encoding时会发生什么?

  9. 9

    当您从非AD帐户调用UserPrincipal.Current.GivenName时会发生什么?

  10. 10

    当两个进程同时调用register()时会发生什么

  11. 11

    在/上安装分区时会发生什么?

  12. 12

    在/上安装分区时会发生什么?

  13. 13

    当我混合使用有符号和无符号类型时会发生什么?

  14. 14

    当我在同一指针中两次使用malloc()时会发生什么?

  15. 15

    当您在某个进程上按ctrl + z时会发生什么?

  16. 16

    进程在X服务器上运行时会发生什么变化

  17. 17

    当您产生一个activerecord对象时会发生什么?

  18. 18

    当您传递android systemclock.sleep(long)一个负参数时会发生什么

  19. 19

    使用管道在同一进程上执行多个Shell命令时读取死锁

  20. 20

    GCM:在多个设备上使用同一帐户-会发生什么?

  21. 21

    当您使用Task.Run太多而导致线程池耗尽时会发生什么?

  22. 22

    当您使用多个嵌套作用域时会发生什么?

  23. 23

    当您使用范围通道中断for语句时会发生什么

  24. 24

    当您使用jquery更改img标签的src时会发生什么?

  25. 25

    当您使用“ + =”在Java中“更改”字符串时会发生什么情况?

  26. 26

    当您使用 select# 作为 css 选择器时会发生什么?

  27. 27

    当您从《虚无》中抽奖时会发生什么?

  28. 28

    当您打开/关闭手柄时会发生什么?

  29. 29

    当您移到非右值参考时会发生什么?

热门标签

归档