fork()的继承内容

子进程完全复制了父进程的内容,除了下面的东西(posix标准):

  1. PID
  2. PPID
  3. memory lock (mlock, mlockall)

    mlock主要是用来防止部分虚拟地址空间被交换到交换空间。

  4. Process resource utilizations 和 CPU time counters

    系统资源使用率是指像CPU使用时间,内存使用大小,IPC消息传递数量,上下文切换次数等,这些当然是独立的。计时器的话指的是用户使用时间、内核使用时间之类的,也是得清0。

  5. pending signals

    这里说一下,pending signals指的是像sigterm、sigkill、sigstop…包含这些个信号的列表,这些信号因为进程处于D(uninterruptible sleep)状态,而无法及时被处理,等待的进程被唤醒。

  6. process-associated record locks

    比如文件锁flock之类的,这类锁只能关联一个进程,所以子进程当然也没办法继承咯。

  7. timers

    定时器是无法被继承的,可能因为跟信号有关?

  8. asynchronous I/O operations (aio_read, aio_write)

此外注意下面的点:

  • 当一个线程通过fork()创建一个子进程,整个虚拟地址空间都会被拷贝,包括mutex的状态,条件变量,还有其他的pthread objects。可以使用pthread_atfork()来处理一些mutex之类的问题。
  • 当多线程的进程fork之后,子进程应该只调用async-signal-safe函数(man signal-safety),直到它调用execve。
  • 子进程继承了父进程的打开的文件描述符的列表。他们指向了相同的文件描述,也就是说两个文件描述符共享打开文件的状态,文件offset,信号驱动I/O属性。
  • 总之,不要在多线程的进程中尝试使用fork()。

参考:man fork(2) http://man7.org/linux/man-pages/man2/fork.2.html

你可能感兴趣的:(linux,操作系统)