LinuxC:我什么时候需要;克隆;函数而不是“函数”;叉子;?

LinuxC:我什么时候需要;克隆;函数而不是“函数”;叉子;?,c,linux,process,fork,clone,C,Linux,Process,Fork,Clone,手册页上说: 与fork(2)不同,clone()允许子进程共享其部分内容 调用进程的执行上下文,例如内存 空间、文件描述符表和信号表 处理程序。(请注意,在本手册页面上,“调用过程”通常为 对应于“父进程”。但请参见 克隆(请参见下面的父项。) 我不理解的是“文件描述符表”,因为当我使用fork时,子进程当然可以写入父进程打开的FD,就像我在下面测试的那样: $ cat myfork.cpp #include<fcntl.h> #include<unistd.h> in

手册页上说:

与fork(2)不同,clone()允许子进程共享其部分内容 调用进程的执行上下文,例如内存 空间、文件描述符表和信号表 处理程序。(请注意,在本手册页面上,“调用过程”通常为 对应于“父进程”。但请参见 克隆(请参见下面的父项。)

我不理解的是“文件描述符表”,因为当我使用fork时,子进程当然可以写入父进程打开的FD,就像我在下面测试的那样:

$ cat myfork.cpp
#include<fcntl.h>
#include<unistd.h>
int main()
{
    int f1=open("./test.txt",O_CREAT|O_RDWR);
    pid_t id=fork();
    if(id>0)//father
    {
    sleep(1);
    for(size_t i=0;i<10;++i)
    {
        sleep(2);
        write(f1,"father write1\n",14);
    }
    }
    else//child
    {
    for(size_t i=0;i<10;++i)
    {
        sleep(2);
        write(f1,"child write1\n",13);
    }
    }
    close(f1);
    return 0;
}

这两个进程可以依次写入同一个文件,所以我可以理解“分叉”进程也可以共享fd表吗?那么“克隆”功能的必要性是什么呢?

表不是共享的,而是复制的。在
fork
之后,每个进程都有自己的文件描述符表


要实现线程之类的功能,需要共享该表,以便在两个调度实体中都能看到对文件描述符的更改。

该表不是共享的,而是复制的。在
fork
之后,每个进程都有自己的文件描述符表


要实现线程之类的功能,需要共享表,以便在两个调度实体中都能看到对文件描述符的更改。

更简单地说,
clone
只对线程实现者有用(编写POSIX线程之类库的人很少,使用POSIX线程的人不多)简单地说,
clone
只对线程实现者有用(编写POSIX线程之类的库的人很少,使用POSIX线程的人不多)
$ cat test.txt
child write1
father write1
child write1
father write1
child write1
father write1
child write1
father write1
child write1
father write1
child write1
father write1
child write1
father write1
child write1
father write1
child write1
father write1
child write1
father write1