Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,因此它是on-topic,用于堆栈溢出。
                        
                        6个月前关闭。
                                                                                            
                
        
我知道exec应该替换整个过程映像,但是我也知道在调用exec -family函数之一时会保留诸如文件描述符之类的内容。

调用execve()时,环境的各个方面基于什么基础?

最佳答案

来自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的实现是实现定义的。

关于c - 在什么基础上调用execve()可以保持环境的各个方面? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57581393/

10-11 15:32
查看更多