首页 > 解决方案 > 在调用 execve() 时,环境的各个方面基于什么保持?

问题描述

我知道这应该替换整个过程映像,但我也知道在调用-family 函数exec之一时会保留文件描述符等某些内容。exec

环境的各个方面是在什么基础上受到呼吁的execve()

标签: clinuxprocessexec

解决方案


来自execve(3)

在 execve() 期间保留所有进程属性,但以下情况除外:

  • 任何被捕获的信号的配置都将重置为默认值 (signal(7))。

  • 不保留任何备用信号堆栈 (sigaltstack(2))。

  • 不保留内存映射 (mmap(2))。

  • 附加的 System V 共享内存段被分离 (shmat(2))。

  • POSIX 共享内存区域未映射 (shm_open(3))。

  • 打开的 POSIX 消息队列描述符被关闭 (mq_overview(7))。

  • 任何打开的 POSIX 命名信号量都是关闭的 (sem_overview(7))。

  • 不保留 POSIX 计时器 (timer_create(2))。

  • 关闭任何打开的目录流 (opendir(3))。

  • 不保留内存锁(mlock(2)、mlockall(2))。

  • 不保留退出处理程序(atexit(3)、on_exit(3))。

  • 浮点环境被重置为默认值(请参阅 fenv(3))。

POSIX 也规定了这一点(尽管被否定了):

新进程应至少从调用进程映像继承以下属性:

  • 不错的价值(见 nice())

  • semadj 值(参见 semop())

  • 进程 ID

  • 父进程 ID

  • 进程组 ID

  • 会话成员

  • 真实用户 ID

  • 真实组 ID

  • 补充组 ID

  • 距离闹钟信号还剩的时间(参见alarm())

  • 当前工作目录

  • 根目录

  • 文件模式创建掩码(参见 umask())

  • 文件大小限制(参见 getrlimit() 和 setrlimit())

  • 进程信号掩码(参见 pthread_sigmask())

  • 待处理信号(参见 sigpending())

  • tms_utime、tms_stime、tms_cutime 和 tms_cstime(参见 times())

  • 资源限制

  • 控制终端

  • 间隔计时器

新进程的初始线程应至少从调用线程继承以下属性:

  • 信号掩码(参见 sigprocmask() 和 pthread_sigmask())

  • 待处理信号(参见 sigpending())

本卷 POSIX.1-2017 中定义的所有其他过程属性应在新过程映像中从旧过程映像继承。本卷 POSIX.1-2017 中定义的所有其他线程属性应在新进程映像中的初始线程中从旧进程映像中的调用线程继承。本卷 POSIX.1-2017 未定义的进程或线程属性的继承是实现定义的。


推荐阅读