C C  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Процессы и каналы POSIX

Тест проверяет жизненный цикл процессов POSIX: fork и exec, наследование дескрипторов, потоковую природу pipe, сбор статусов, диагностику зависаний и безопасный запуск без оболочки.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 6 темам.
Вопрос 1 из 30
Сколько раз будет напечатано `X`, если оба fork успешны?
CC17
fork();
fork();
printf("X\n");
Вопрос 2 из 30
Почему строка может попасть в файл дважды после `fork`?
CC17
printf("начало");
pid_t p=fork();
if(p>=0) exit(0);
Вопрос 3 из 30
Как отличить ветвь дочернего процесса?
CC17
pid_t p=fork();
if(p==0){ /* child */ }
else if(p>0){ /* parent */ }
else { /* error */ }
Вопрос 4 из 30
Как ведёт себя память обычных переменных после успешного `fork`?
CC17
int x=1;
if(fork()==0) x=9;
else sleep(1);
printf("%d\n",x);
Вопрос 5 из 30
Какой дефект у кода при неудаче fork?
CC17
pid_t p=fork();
if(p==0) child();
else parent(p);
Вопрос 6 из 30
Какая строка выполняется после успешного execl?
CC17
execl("/bin/echo","echo","ok",(char*)NULL);
perror("execl");
Вопрос 7 из 30
Какой дефект есть в массиве `argv`, переданном функции `execvp`?
CC17
char *argv[2]={"echo","hello"};
execvp(argv[0],argv);
Вопрос 8 из 30
Как безопаснее запустить заданную программу с недоверенным именем файла?
CC17
char *argv[]={"tool","--",name,NULL};
execv("/usr/bin/tool",argv);
Вопрос 9 из 30
Зачем ставят FD_CLOEXEC на служебный дескриптор?
CC17
fcntl(fd,F_SETFD,FD_CLOEXEC);
Вопрос 10 из 30
Почему после неудачного `exec` в дочернем процессе часто используют `_exit`, а не `exit`?
CC17
execv(path,argv);
perror("execv");
_exit(127);
Вопрос 11 из 30
Почему родитель не получает EOF после завершения ребёнка?
CC17
int p[2]; pipe(p);
if(fork()==0){ close(p[0]); write(p[1],"x",1); _exit(0); }
/* parent forgot close(p[1]) */
while(read(p[0],buf,sizeof buf)>0){}
Вопрос 12 из 30
Какое утверждение о pipe верно?
Вопрос 13 из 30
Что делать при `write` меньше n без фатальной ошибки?
CC17
ssize_t r = write(fd, p, n);
if (r < 0) return -1;
return 0; /* короткая запись пока не учтена */
Вопрос 14 из 30
После успешных `pipe` и `fork` какой конец канала должен оставить ребёнок, который только отправляет данные родителю?
CC17
int p[2];
pipe(p);
pid_t pid = fork();
/* дочерний процесс только отправляет данные родителю */
Вопрос 15 из 30
Почему структуру нельзя считать переносимым форматом сообщения для канала между разными архитектурами?
CC17
write(fd,&rec,sizeof rec);
Вопрос 16 из 30
Как получить код обычного завершения ребёнка?
CC17
int st;
pid_t child = waitpid(pid, &st, 0);
if (child == pid) {
    /* извлечь обычный код завершения, если он есть */
}
Вопрос 17 из 30
Что называют процессом-зомби?
Вопрос 18 из 30
Как собрать всех завершившихся детей без блокировки в обработчике события?
CC17
while((p=waitpid(-1,&st,WNOHANG))>0) handle(p,st);
Вопрос 19 из 30
Почему `wait(NULL)` один раз недостаточен после запуска десяти детей?
Вопрос 20 из 30
Как распознать завершение сигналом?
CC17
int status;
pid_t r = waitpid(pid, &status, 0);
if (r == pid) {
    /* ребёнок мог завершиться нормально или из-за сигнала */
}
Вопрос 21 из 30
Какой запуск strace нужен, чтобы видеть системные вызовы потомков?
CC17
strace -f -o trace.log ./pipeline
Вопрос 22 из 30
Один процесс ждёт данные из канала, другой — завершения первого. На что указывает такая схема?
Вопрос 23 из 30
Как узнать, какие дескрипторы реально открыты у процесса Linux?
CДиагностика Linux
pid_t target = pid_of_running_process;
/* выбрать способ увидеть фактически открытые файловые дескрипторы target */
Вопрос 24 из 30
Почему журнал с pid важнее общего сообщения «ошибка чтения»?
Вопрос 25 из 30
Как минимально проверить гипотезу о незакрытом пишущем конце канала?
CC17
close(p[1]);
ssize_t n=read(p[0],buf,sizeof buf); /* ожидаем 0 после закрытия всех писателей */
Вопрос 26 из 30
Почему `system("convert " + user)` опасен?
CC17
char cmd[512];
snprintf(cmd,sizeof cmd,"convert %s out.png",user);
system(cmd);
Вопрос 27 из 30
Что нужно проверить после снижения привилегий через `setgid` и `setuid`?
Вопрос 28 из 30
Какой риск у exec программы по имени через PATH в привилегированном процессе?
CC17
execvp("helper",argv);
Вопрос 29 из 30
Зачем очищать/формировать окружение для дочерней программы?
Вопрос 30 из 30
Как избежать утечки секретного fd в exec?
CC17
int fd = open(path, O_RDONLY);
/* затем процесс может выполнить exec */

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу