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