peo*_*oro 15
这与C没什么关系,而是与fork()POSIX系统调用有关(我猜它在不同的系统上可能表现不同).
我建议你阅读fork手册,这是非常明确的:
fork()通过复制调用进程来创建新进程.被称为子节点的新节点与调用进程完全相同,称为父节点,但以下几点除外:
子项具有自己唯一的进程ID,并且此PID与任何现有进程组的ID不匹配(
setpgid(2)).子进程的父进程ID与父进程ID相同.
子进程不继承父进程的内存锁(
mlock(2),mlockall(2)).进程资源利用率(
getrusage(2))和CPU时间计数器(times(2))在子进程中重置为零.孩子的待处理信号组最初是空的(
sigpending(2)).孩子不会从其父母那里继承信号量调整(
semop(2)).子进程不从父进程继承记录锁(
fcntl(2)).孩子不从其父母那里继承计时器(
setitimer(2),alarm(2),timer_create(2)).子进程不从其父进程(
aio_read(3),aio_write(3))继承未完成的异步I/O操作,也不从其父进程继承任何异步I/O上下文(参见io_setup(2)).前面列表中的进程属性都在POSIX.1-2001中指定.父级和子级在以下特定于Linux的进程属性方面也有所不同:
子进程不会从其父进程继承目录更改通知(dnotify)(请参阅
fcntl(2)中的F_NOTIFY说明).在
prctl(2)PR_SET_PDEATHSIG设定被复位,使得当它的父终止子不接收信号.已标记为
madvise(2)MADV_DONTFORK标志的内存映射不会在a上继承fork().孩子的终止信号总是
SIGCHLD(见clone(2)).请注意以下几点:
子进程是使用单个线程创建的 - 即调用的线程
fork().父节点的整个虚拟地址空间在子节点中复制,包括互斥锁,条件变量和其他pthreads对象的状态;pthread_atfork(3)的使用可能有助于处理这可能导致的问题.子进程继承父进程打开文件描述符的副本.子
open节点中的每个文件描述符引用与父节点中相应的文件描述符相同的打开文件描述(参见(2)).这意味着,两个描述符共享打开文件状态标志,当前文件偏移量,以及信号驱动的I/O的属性(见的描述F_SETOWN和F_SETSIG在fcntl(2)).子进程继承父进程的开放消息队列描述符集的副本(参见
mq_overview(7)).子节点中的每个描述符引用与父节点中相应描述符相同的开放消息队列描述.这意味着两个描述符共享相同的标志(mq_flags).子进程继承父进程打开目录流的副本(参见
opendir(3)).POSIX.1-2001表示父节点和子节点中相应的目录流可以共享目录流定位; 在Linux/glibc上他们没有.
如果您对Linux感兴趣,还应检查clone系统调用,以便更准确地指定所需内容.
system(man fork)上的fork(2)手册页应该为您提供更好的细节,但通常子进程只会继承父对象的文件描述符列表,包括打开文件,套接字和进程句柄.
从我系统的手册页(Mac OS X 10.6.6):
子进程有自己父级描述符的副本.这些描述符引用相同的底层对象,因此,例如,文件对象中的文件指针在子进程和父进程之间共享,因此子进程中描述符上的lseek(2)可以影响后续的读取或写入父母.shell还使用此描述符复制为新创建的进程建立标准输入和输出以及设置管道.