Родитель, а не ребенок должен вызывать tcsetpgrp (). После вызова setpgid () дочерний процесс становится фоновым процессом. Допустимым случаем является то, что группа переднего плана отказывается от своего разрешения, пусть другая группа фона становится передним планом и сама становится фоном. Процесс в фоновой группе не может захватить управляющий терминал. Пример кода может выглядеть так:

аюсь дать ребенку процесс (черезfork()) передний доступ к терминалу.

После того как яfork()Я запускаю следующий код в дочернем процессе:

setpgid(0, 0);

А также:

setpgid(child, child);

В родительском процессе.

Это дает ребенку свою собственную группу процессов. Призыв кsetpgid() работает правильно.

Теперь я хочу дать ребенку доступ к терминалу.

Я добавил следующее к ребенку послеsetpgid() вызов:

if (!tcsetpgrp(STDIN_FILENO, getpid())) {
    perror("tcsetpgrp failed");
}

После этого естьexecv() команда порождать/usr/bin/nano.

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

Кроме того, кажется, что код не выполняется послеtcsetpgrp() вызов.

Я где-то читал, что мне нужно отправитьSIGCONT сигнализировать дочернему процессу, чтобы заставить его работать. Если процесс остановлен, как я могу это сделать? Должен ли родитель отправить сигнал?

Как я могу отправитьSIGCONT сигнал, если это решение?

raise(SIGCONT);

Кроме того, я не уверен, что это помогает, но код работает нормально и порождаетnano если я запускаю свою программу с:

exec ./program

Вместо:

./program

Есть идеи? Спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос