LINUX.ORG.RU

Quiz для профф. Pay attention, please.

 ,


0

3

Добрый день, дорогие форумчане! Подоспел быстрый квиз, взятый из собеседования на лида в крупную компанию. Как бы вы ответили?

Для каждого вопроса лишь один(!) правильный ответ.

  1. Процесс открывает файл, вызывает fork(). Файл в child доступен на чтение?
  • A. Да
  • B. Нет
  • C. Перед вызовом fork() необходимо закрывать все открытые файлы
  • D. Нет, файл автоматически будет закрыт системой в дочернем процессе
  • E. Зависит от реализации, поведение не определено
  1. Участки памяти создаются при создании потока?
  • A. heap
  • B. stack
  • C. data segment
  • D. code segment
  1. Можно ли заблокировать cигналы SIGHUP(1), SIGKILL(9), SIGTERM(15)?
  • A. да все
  • B. только SIGHUP
  • C. только SIGKILL
  • D. только SIGTERM
  • E. только SIGHUP и SIGKILL
  • F. только SIGHUP и SIGTERM
  • G. только SIGKILL и SIGTERTM
  1. В программе не установлен обработчик на сигнал SIGUSR1. Что будет, если такой сигнал пришёл?
  • A. Будет проигнорирован
  • B. Будет вызван обработчик по умолчанию, созданный операционной системой
  • C. Программа завершит свою работу
  • D. Программа перейдёт в состояние «ожидание»
  1. Процесс выделяет память и вызывает функцию fork(). child модифицирует память. Корректна ли такая операция и если да, то будут ли доступны изменения памяти дочернего процесса в родительском процессе?
  • A. Такая операция некорректна, дочерний процесс завершит своё выполнение
  • B. Такая операция некорректна, поведение системы не определено
  • C. Допустимая операция, данные из дочернего процесса будут доступны в родительском
  • D. Допустимая операция, данные из дочернего процесса не будут доступны в родительском
  • E. Допустимая операция. Родительский процесс при изменении данных получит сигнал SIGMEM
  1. Почему для многих функций, например таких как readdir и strtok, существуют аналоги (readdir_r и strtok_r)?
  • A. Ресурсы выделенные такими функциями не освобождаются корректно при прерывании потока.
  • B. Эти функции не безопасны при возникновении асинхронных сигналов.
  • C. Эти функции не потокобезопасные.
  • D. Эти функции могут блокировать выполнение всех потоков процесса если они будут заблокированы до выделения запрошенных ресурсов.
  • E. Ресурсы выделенные такими функциями не освобождаются корректно при нормальном завершении потока.
  1. Вызов select() иногда используется вместо вызова sleep() для приостановки выполнения программы на заданный период времени. Почему?
  • A. на select() не может оказать влияние операции ввода-вывода.
  • B. вызов select() не прерывает асинхронные операции ввода вывода во время паузы.
  • C. select() не может быть прерван сигналами.
  • D. вызову select() можно указать паузу с точность до микросекунд.
  • E. select() позволяет процессу перехватывать сигналы, позволя при этом дождаться окончания установленной паузы.
  1. Что из нижеперечисленного нельзя использовать для предотвращения одновременного доступа к общему объекту из разных потоков?
  • A. mutex
  • B. posix semaphore
  • C. flock
  • D. rwlock
  1. При использовании схемы producer and consumer (производитель и потребитель) какой механизм синхронизации можно использовать?
  • A. mutex
  • B. condition variable
  • C. mutex и condition variable
  1. Какая функция создаёт объект разделяемой памяти?
  • A. CreateFileMapping
  • B. shm_open
  • C. mmap
  • D. fcntl
  1. Ограничения при использовании разделяемой памяти (shared memory)?
  • A. Ограничений нет
  • B. Разделяемую память нельзя использовать в потоках
  • C. Нельзя изменить размер созданного объекта разделяемой памяти
  • D. Объект разделяемой памяти нельзя использовать совместно между не дочерними процессами
  1. Синхронизация доступа к данным между двумя процессами. Необходимо обеспечить наилучшую переносимость между различными Unix. Какие функции вы бы использовали для обеспечениния поставленной задачи?
  • A. pthread_mutex_lock
  • B. flock
  • C. semop
  • D. pthread_mutex_lock, flock
  • E. flock, semop
  1. Для того, чтобы работать с дескриптором в неблокирующем режиме надо:
  • A. передать специальные параметры вызову socket/open
  • B. использовать select
  • C. использовать fcntl

1A, если файл был открыт на чтение, а не, например, запись

2B

3F

4C

5D

6C, но, кажется, устарело

7D, но, кажется, устарело

8D? не предотвратит одновременное чтение? странный вопрос.

9A и C

10C

11C

12C

13А

Как-то кажется, что этот тест дидам давали. Надеюсь, не много поошибался

blex ★★
()
Ответ на: комментарий от blex

Как-то кажется, что этот тест дидам давали. Надеюсь, не много поошибался

А теперь его дали автору темы и он ищет ответы.

Варианты ответов кстати некорректные в нескольких местах.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Без рассуждений голые ответы не интересно, поэтому попробую с ними. Отвечает PHP-макака:

1. Процесс открывает файл, вызывает fork(). Файл в child доступен на чтение?
A. Да
B. Нет
C. Перед вызовом fork() необходимо закрывать все открытые файлы
D. Нет, файл автоматически будет закрыт системой в дочернем процессе
E. Зависит от реализации, поведение не определено

На первый взгляд - А, т.к. при форке копируются дескрипторы, но перед форком вполне может быть fcntl(fd, F_SETFD, FD_CLOEXEC) и тогда при форке этот дескриптор превратиться в тыкву, получается что правильный ответ E - поведение не определено, нужно смотреть в код.

2. Участки памяти создаются при создании потока?
A. heap
B. stack
C. data segment
D. code segment

Ответ B - т.к. поток же имеет свой уникальный стек. А т.к. правильный ответ один, дальше можно не раздумывать.

3. Можно ли заблокировать cигналы SIGHUP(1), SIGKILL(9), SIGTERM(15)?
A. да все
B. только SIGHUP
C. только SIGKILL
D. только SIGTERM
E. только SIGHUP и SIGKILL
F. только SIGHUP и SIGTERM
G. только SIGKILL и SIGTERTM

Ответ E, тк libpthread чето такое может, но блокировать вообще все - вряд ли, иначе программисты отстрелят себе яйца отрубив возможность вообще завершать свое поделие. Потому я бы оставил SIGTERM неперехватываемым.

4. В программе не установлен обработчик на сигнал SIGUSR1. Что будет, если такой сигнал пришёл?
A. Будет проигнорирован
B. Будет вызван обработчик по умолчанию, созданный операционной системой
C. Программа завершит свою работу
D. Программа перейдёт в состояние «ожидание»

Правильный ответ С потому что ну камон, это тоже явно вопросы оп POSIX C имплементации т.е. по умолчанию либо ошибка либо завершение программы. Т.к. варианта с ошибкой нет, то ответ «C. Программа завершит свою работу»

5. Процесс выделяет память и вызывает функцию fork(). child модифицирует память. Корректна ли такая операция и если да, то будут ли доступны изменения памяти дочернего процесса в родительском процессе?
A. Такая операция некорректна, дочерний процесс завершит своё выполнение
B. Такая операция некорректна, поведение системы не определено
C. Допустимая операция, данные из дочернего процесса будут доступны в родительском
D. Допустимая операция, данные из дочернего процесса не будут доступны в родительском
E. Допустимая операция. Родительский процесс при изменении данных получит сигнал SIGMEM

Похоже, что это вопрос на поведение CoW, т.е. операция точно корректна (C,D или E). Если я правильно помню там память копируется когда кто-то из них ее поменяет и будет 2 варианта памяти, у каждого свой. Поэтому предположу что ответ «D. Допустимая операция, данные из дочернего процесса не будут доступны в родительском»

6. Почему для многих функций, например таких как readdir и strtok, существуют аналоги (readdir_r и strtok_r)?
A. Ресурсы выделенные такими функциями не освобождаются корректно при прерывании потока.
B. Эти функции не безопасны при возникновении асинхронных сигналов.
C. Эти функции не потокобезопасные.
D. Эти функции могут блокировать выполнение всех потоков процесса если они будут заблокированы до выделения запрошенных ресурсов.
E. Ресурсы выделенные такими функциями не освобождаются корректно при нормальном завершении потока.

Первая мысль что от рекурсивных функций отказались тк они могут лажать с буфером из-за переполнения, но такого ответа нет. Думаем дальше, рекурсивное выполнение может создавать проблемы при использовании в многопоточном режиме, такой ответ есть (С). Блокировка при рекурсивном выполнении не происходит елси я правильно помню, а ресурсы освободятся нормально если не переполнился стек, они просто размотаются в обратном порядке. Поэтому правильный ответ: «C. Эти функции не потокобезопасные.»"

7. Вызов select() иногда используется вместо вызова sleep() для приостановки выполнения программы на заданный период времени. Почему?
A. на select() не может оказать влияние операции ввода-вывода.
B. вызов select() не прерывает асинхронные операции ввода вывода во время паузы.
C. select() не может быть прерван сигналами.
D. вызову select() можно указать паузу с точность до микросекунд.
E. select() позволяет процессу перехватывать сигналы, позволя при этом дождаться окончания установленной паузы.

Это какой-то трюк, скорее всего в таком варианте не блокировки процесса потому A или B. Склоняюсь к «B. вызов select() не прерывает асинхронные операции ввода вывода во время паузы.»

8. Что из нижеперечисленного нельзя использовать для предотвращения одновременного доступа к общему объекту из разных потоков?
A. mutex
B. posix semaphore
C. flock
D. rwlock

Ответ «B. posix semaphore» т.к. остальные просто блокируют на разных уровнях, а posix semaphore можно как установить так и снять.

9. При использовании схемы producer and consumer (производитель и потребитель) какой механизм синхронизации можно использовать?
A. mutex
B. condition variable
C. mutex и condition variable

Это просто паттерн, не вижу причин почему нельзя было бы реализовать его обоими способами, потому ответ «C. mutex и condition variable»

10. Какая функция создаёт объект разделяемой памяти?
A. CreateFileMapping
B. shm_open
C. mmap
D. fcntl

Ответ: «B. shm_open», методом прищуренного глаза, т.к. префикс shm_ это явно «shared memory».

11. Ограничения при использовании разделяемой памяти (shared memory)?
A. Ограничений нет
B. Разделяемую память нельзя использовать в потоках
C. Нельзя изменить размер созданного объекта разделяемой памяти
D. Объект разделяемой памяти нельзя использовать совместно между не дочерними процессами

Я помню что лазил в разделяемую память и никаких ограничений из перечисленных не помню. Потому, ответ «A. Ограничений нет»

12. Синхронизация доступа к данным между двумя процессами. Необходимо обеспечить наилучшую переносимость между различными Unix. Какие функции вы бы использовали для обеспечениния поставленной задачи?
A. pthread_mutex_lock
B. flock
C. semop
D. pthread_mutex_lock, flock
E. flock, semop

Даже не зная тонкости реализаций этих команд использовал бы то где есть префикс «pthread_» тк это явно расово верный POSIX, т.е. ответы или A или D. Но в вопросе есть «обеспечить наилучшую переносимость» значит чем меньше команд используется тем лучше, поэтому ответ «A. pthread_mutex_lock»

13. Для того, чтобы работать с дескриптором в неблокирующем режиме надо:
A. передать специальные параметры вызову socket/open
B. использовать select
C. использовать fcntl

Ну это даже в PHP через флаги работает потому ответ: «A. передать специальные параметры вызову socket/open».

Итого: 1.E, 2.B, 3.E, 4.C, 5.D, 6.C, 7.B, 8.B, 9.C, 10.B, 11.A, 12.A 13.A

Заработал на банан или нет?

Obezyan
()
Ответ на: комментарий от firkax

Варианты ответов кстати некорректные в нескольких местах.

Ну это-то нормально, если тест дается в процессе беседы, а не молча. Помогает ответить на вопрос, способен ли собеседуемый лид сказать в нужный момент «что ты за херню несешь».

blex ★★
()
Ответ на: комментарий от firkax

Варианты ответов кстати некорректные в нескольких местах.

Не то что в некоторых, а похоже во всех местах, если работал с разными системами, а не только с Linux… 🤔

raspopov
()
Ответ на: комментарий от firkax

Варианты ответов кстати некорректные в нескольких местах

Частенько встречаю такое в тестах, и это бесит. Потом эти криворучки оценивают уровень твоих знаний.

seiken ★★★★★
()

Просмотрел по диагонали вопросы. Это просто тест на знание базы *nix. Это известно людям, которые прочитали первую книгу по предмету. Если лид технический, то как-то слабовато для лида.

seiken ★★★★★
()
Ответ на: комментарий от Obezyan

Ну как мы видим разные ответы. У меня тоже немного своё) Мне интервьювер не дал сравнить с верным ответом) Так что, можно самого себя оценить и дать банан или нет)) За размышления спасибо, ценно.

avovana7
() автор топика

Есть некая неоднозначность в вопросах:

2. Считать ли thread-local частью data segment?

8. Не вижу причин почему flock'ом нельзя блокировать параллельный доступ через один файловый дескриптор.

13. Верны A и C.
cumvillain
()
Последнее исправление: cumvillain (всего исправлений: 1)
Ответ на: комментарий от avovana7

Давайте) Тогда что?

Тогда A и C.

Ок. Почему select тогда ещё не включить?

Ммм… потому что тебе не обязательно делать поллинг, ты можешь топить в безумный busy wait loop:

for (;;) {
    ret = read(fd, buf, nr_bytes);
    if (ret == -1 && errno == EAGAIN)
        /* do something else */
}
cumvillain
()
Ответ на: комментарий от cumvillain

Тогда A и C.

Второй вопрос же: Участки памяти создаются при создании потока?

Про вызов thread_local ничего не говориться. А при создании потока ДО ВЫПОЛНЕНИЯ КОДА в этом потоке точно создается стек, да и ответ по условию только один - поэтому ответ B.

Obezyan
()
Ответ на: комментарий от Obezyan

Про вызов thread_local ничего не говориться. А при создании потока ДО ВЫПОЛНЕНИЯ КОДА в этом потоке точно создается стек, да и ответ по условию только один - поэтому ответ B.

Вызов чего? thread_local лежит в ELF с пометкой @tls_object.

cumvillain
()
Ответ на: комментарий от Obezyan

Сегодня ещё получил ответ про heap. Доказывали, что надо и его указать.

«strictly speaking, the act of creating a thread doesn’t create the arena; it gets created by the first malloc in that thread. But since the arena pointer is a thread_local information and that will have reset to null, effectively that creates a new heap too.»

avovana7
() автор топика
Ответ на: комментарий от avovana7

«strictly speaking, the act of creating a thread doesn’t create the arena; it gets created by the first malloc in that thread. But since the arena pointer is a thread_local information and that will have reset to null, effectively that creates a new heap too.»

Это уже от аллокатора зависит. Если у тебя аллокатор без арены, то нет.

cumvillain
()
Ответ на: комментарий от cumvillain

Ну вот да. Список спросили просто для простановки галочек. Видимо, потом сравнивают кандидатов - кто сколько баллов набрал в соответствие с их пониманием правильных ответов.

avovana7
() автор топика

А где тут вопросы «на лида»? Про управление командой и так далее?

Это уровень компетенции мидлов, и то максимум.

Ну и как обычно, вопросы идиотские, потому что, во-первых, показывают только зубрежку каких-то абсолютно не связанных вещей, а во-вторых, как обычно на собеседованиях к идиотам, спрашивают вещи типа «если вставить себе ружье в жопу и выстрелить - куда первее дойдет пуля - в сердце или в почку?» которые проверяют только то, насколько тебе сильно хочется в эту говноконтору попасть.

lovesan ★★
()
Ответ на: комментарий от lovesan

А где тут вопросы «на лида»? Про управление командой и так далее?

Вынужден согласиться.

вопросы идиотские

Какой язык, такие и вопросы. Хотя скорее всего там HR попросил одного из текущих разрабов составить, тот и накидал не сильно вникая.

И вообще, вопросы на викторину заготовил, а правильные ответы - нет.

если вставить себе ружье в жопу и выстрелить - куда первее дойдет пуля - в сердце или в почку?

Ответ зависит от того в какой вы будете позе при этом, нужен эксперимент.

* займите Лавсана приятной беседой, я пока за ружьем схожу.

Obezyan
()
Ответ на: комментарий от avovana7

«strictly speaking, the act of creating a thread doesn’t create the arena; it gets created by the first malloc in that thread. But since the arena pointer is a thread_local information and that will have reset to null, effectively that creates a new heap too.»

Ну я сейчас полез смотреть эти ваши pthreads. Там четко написано что:

Each thread has a unique:
Thread ID
set of registers, stack pointer
stack for local variables, return addresses  <==== Ответ: B. stack
signal mask
priority
Return value: errno
Obezyan
()

Процесс открывает файл, вызывает fork(). Файл в child доступен на чтение?

А если файл был открыт только на запись? Если у него ACL только на запись?

Участки памяти создаются при создании потока?

Участки память могут какие угодно создаваться. Если у тебя какой-нибудь C# и ты создаешь там объект треда - че тут отвечать вообще? Или буст или прочая пурга в крестах? Где там умные указатели умными указателями погоняют.

Можно ли заблокировать cигналы SIGHUP(1), SIGKILL(9), SIGTERM(15)?

А если из под обычного пользователя руту?

В программе не установлен обработчик на сигнал SIGUSR1.

Это значит разработчик молодец, потому что сигналы это отличный способ оторвать себе жопу.

Процесс выделяет память и вызывает функцию fork(). child модифицирует память. Корректна ли такая операция и если да, то будут ли доступны изменения памяти дочернего процесса в родительском процессе?

Разработчик приложения увольняется нахер, по причине того что fork без exec это отличный способ оторвать жопу, и нормальные люди так не делают.

Почему для многих функций, например таких как readdir и strtok, существуют аналоги (readdir_r и strtok_r)?

Потому что в unix-like системах абсолютно всратые naming conventions, типа «кулхацкерные».

Вызов select() иногда используется вместо вызова sleep() для приостановки выполнения программы на заданный период времени. Почему?

Потому что worse is better, и в Linux куча древнего говна мамонта, которое там из-за обратной совместимости со слепленным на коленке говном из 60х.

Что из нижеперечисленного нельзя использовать для предотвращения одновременного доступа к общему объекту из разных потоков?

Процесс увольнения автора вопросов, к сожалению

При использовании схемы producer and consumer (производитель и потребитель) какой механизм синхронизации можно использовать?

futex

Какая функция создаёт объект разделяемой памяти?

А что такое «объект» в описании вопроса, конечно же, не написано.

Ограничения при использовании разделяемой памяти (shared memory)?

Как насчет нельзя использовать на физически разных машинах?

Синхронизация доступа к данным между двумя процессами. Необходимо обеспечить наилучшую переносимость между различными Unix. Какие функции вы бы использовали для обеспечениния поставленной задачи?

Функцию увольнения составителя Т.З., т.к. переносимость между различными Unix тебе во-первых, к херам не сдалась, во-вторых, там все настолько разное, что писать все-равно придется сраными ifdef-ами(как в случае macos vs linux).

Для того, чтобы работать с дескриптором в неблокирующем режиме надо:

Не блокироваться при работе с ним.

lovesan ★★
()
Ответ на: комментарий от lovesan

А если файл был открыт только на запись? Если у него ACL только на запись?

При fork() копируются файловые дескрипторы, если там не было флага FD_CLOEXEC, то ОБА процесса смогут писать в этот файл. Это С, детка, тут выстрелить в себе ногу можно 1001 способом.

Участки память могут какие угодно создаваться. Если у тебя какой-нибудь C# и ты создаешь там объект треда - че тут отвечать вообще? Или буст или прочая пурга в крестах? Где там умные указатели умными указателями погоняют.

Нет, читайте мое объяснение выше.

А если из под обычного пользователя руту?

Да хоть боженьке, в С можно переопределять обработчики сигналов и стрелять в себе сразу в обе ноги дуплетом.

Это значит разработчик молодец, потому что сигналы это отличный способ оторвать себе жопу.

Это один из способов общения между процессами. Пишешь обработчики этого сигнала и можешь из одного процесса стрелять в ногу другому процессу, удобно же.

Разработчик приложения увольняется нахер, по причине того что fork без exec это отличный способ оторвать жопу, и нормальные люди так не делают.

А причем тут нормальные люди, мы о С говорим.

Потому что worse is better, и в Linux куча древнего говна мамонта, которое там из-за обратной совместимости со слепленным на коленке говном из 60х.

но не лисперу о них рассуждать.

А что такое «объект» в описании вопроса, конечно же, не написано.

Для удобства стрельбы в ноги объектом разделяемой памяти называется структура (struct) данных ядра для отслеживания областей разделяемой памяти т.к. иначе одну и ту же разделяемую память могут выделять себе разные процессы и делать с ней нехорошее.

Как насчет нельзя использовать на физически разных машинах?

Можно, это для тех кто любит картечью по ногам, называется DSM - Distributed Shared Memory.

Функцию увольнения составителя Т.З., т.к. переносимость между различными Unix тебе во-первых, к херам не сдалась, во-вторых, там все настолько разное, что писать все-равно придется сраными ifdef-ами(как в случае macos vs linux).

Признайтесь, вы ведь не просто стремящийся лиспер, Вы ведь виндолиспер, да? Настолько тупые комментарии выдают у вас отсутствие знаний по Linux. Все вопросы в теме на понимание POSIX C implementation.

Obezyan
()

Для особо упорных/интересующихся концовочка квиза)

Sockets, files, poll & …

  1. Вы разрабатываете приложение обрабатывающее большое число соединений в одном процессе, у которого один поток выполнения. Код должен работать без изменений на различных unix подобных системах. Какой системный вызов вы будете использовать? A. select B. pselect C. poll D. epoll E. kqueue

  2. Каким образом можно создать файл только если его нет? A. open B. lstat потом open C. readdir потом open

  3. Что произойдет если процесс А производит чтение из файла, а при этом процесс Б пытается его удалить? A. файл будет удален. Дальнейшая запись в него не удастся. B. произойдёт ошибка при удалении файла. C. файл продолжит существовать до момента закрытия дескриптора процессом А. При этом его можно будет открыть из другого процесса. D. файл продолжит существовать до момента закрытия дескриптора процессом А. При этом его нельзя будет открыть из другого процесса.

  4. Чем Berkeley socket() отличается от POSIX pipe()? A. отличий нет B. дескриптор, созданный функцией pipe(), доступен либо для записи, либо для чтения C. только socket() можно использовать для обмена данными между дочерними процессами D. через pipe() по умолчанию неблокирующий ввод/вывод E. pipe() нельзя использовать для обмена большим объёмом данных

  5. Если у вас есть файловый дескриптор открытого файла, какую из перечисленных функций вы будете использовать при определении позиции в файле, на которую указывает этот дескриптор? A. leof B. lrange C. lpos D. lptr E. lseek

  6. Какую функцию надо вызвать для символьного линка на файл, чтобы определить размер самого файла? A. symstat B. stat C. lstat D. sizeof E. statfs

  7. Причины использования неблокирующих операций ввода-вывода? A. Нет других способов организовать ввод-вывод в программах с GUI. B. Некоторое оборудование, например принтеры, требуют использования неблокирующего ввода-вывода. C. Неблокирующий ввод-вывод обеспечивает выполнение операций ввода-вывода без возникновения ошибок. D. Использование неблокирующего ввода-вывода обеспечивает более лёгкую разработку програмного обеспечения и позволяет писать более компактный код. E. Операция записи может потенциально никогда не завершиться, если записываемые данные не принимаются.

  8. Какую из следующих команд вы будете использовать при выводе списка семафоров в Linux? A. ipcs B. sessreg C. ipcrm

System

  1. Какое из следующих описаний справедливо для файла ‘CMakeLists.txt’?

A. Это пользовательская инструкция, описывающая последовательность действий для сборки проекта B. Список зависимостей, необходимых для сборки проекта C. Список правил, используемых для создания Makefile.in D. Список правил, используемых для создания сборочных скриптов E. Файл, используемый командой «make» для сборки программы

Networks

  1. Происходят ли повторные попытки переслать потерянный пакет при использовании протоков UDP и TCP? A. да B. нет C. только для UDP D. только для TCP

  2. Какой адрес может быть использован для широковещательной передачи запросов(IP Multicast)? A. 192.168.1.0 B. 150.12.23.1 C. 0.23.45.123 D. 10.34.23.255 E. 224.10.23.10

  3. Процесс и его дочерний процесс используют один и тот же сокет. Вам нужно из дочернего процесса «закрыть» сокет так, чтоб он "закрылся"и в родительском процессе. Какую функцию вы станете использовать? A. close B. shutdown C. использование одного сокета в нескольких процессах невозможно D. невозможно закрыть сокет сразу в нескольких процессах

avovana7
() автор топика
Ответ на: комментарий от avovana7

Без правильных ответов эта викторина не оч интересная. Отвечать и потом не узнать результат уже лень.

Да и вопросы мягко говоря не на лида, тут Лавсан прав. Раздел про сети вообще кек, они бы еще попросили продолжить «бело-оранжевый оранжевый бело-зеленый….».

Obezyan
()

Если люди работают из секретного подвала без доступа к интернет и какой-либо документации, то такие вопросы имеют смысл на собеседованиях.

zent
()
Ответ на: комментарий от Obezyan

Я-то прочитал

The child inherits copies of the parent's set of open file
          descriptors.  Each file descriptor in the child refers to the
          same open file description (see open(2)) as the corresponding
          file descriptor in the parent.  This means that the two file
          descriptors share open file status flags, file offset, and
          signal-driven I/O attributes (see the description of F_SETOWN
          and F_SETSIG in fcntl(2)).

phoenix ★★★★
()
Ответ на: комментарий от phoenix

Точно, вы абсолютно правы. И @iliyap тоже правильно подметил. Спасибо обоим за уточнение.

Всегда использовал эти две команды вместе и в голове отложилось что fork чистит вилкой дескрипторы, а не execve. Чет я уже начал подзабывать это ваше С.

Obezyan
()