2017-01-02 1 views
1

Страница человек говорит:linux c: Когда мне нужна функция «клонировать» вместо «fork»?

В отличие от вилки (2), клон() позволяет процессу потомку разделять части их контекста выполнения с вызывающим процессом, такие как память пространства, таблицы файла дескрипторов и таблицы сигналов обработчиков. (Обратите внимание, что на этой странице руководства, «называя процесс» обычно соответствует «родительскому процессу». Но посмотрите описание флага CLONE_PARENT ниже.)

То, что я не понимаю «таблица дескрипторов файлов », потому что, когда я использую вилку, ребенок, конечно, может написать в 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; 
} 

Ходовой результат:

$ 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 

Оба процесса могут поочередно писать в один и тот же файл, так что я могу понять, что процесс «раздвоения» также может делиться таблицей fd? Тогда в чем же необходимость «клонирования»?

ответ

4

Таблица не является общей, она копируется. После fork каждый процесс имеет свою собственную таблицу дескрипторов файлов.

Чтобы реализовать такие вещи, как потоки, вам нужна таблица для совместного использования, так что изменения в дескрипторе файла отображаются в обоих объектах планирования.

+2

Проще говоря, 'clone' действительно полезен только для разработчиков потоков (мало кто пишет такие библиотеки, как потоки POSIX, а не многие люди, используя * потоки POSIX) –

Смежные вопросы