_ RU.UNIX (2:5077/15.22) _____________________________________________ RU.UNIX _
From : Serg Ostapenko 2:5020/400 01 Dec 99 18:33:22
Subj : [Linux] Попытка разобраться с псевдотерминалами pts'98
________________________________________________________________________________
From: "Serg Ostapenko" <osix@permonline.ru>
Здраствуйте.
Имею: Red Hat 6.0, kernel - 2.2.15-5 + в ядре включена поддержка Unix pts'98
Раньше в СКО 3.0 была написана задача, которая переключала ввод-вывод с
текущего терминала на другой (с одной виртуальной консоли на другую).
Устройства назывались tty. В связи с перездом на Линукс возникла проблема -
эта задача корректно не работает под Х и псевдотерминалами.
Вопросы:
По Линуксу
1. Могу ли я отключить поддержку pts'98? Hа каких тогда терминалах будет
запускаться xterm?
2. В ядре отключил поддержку unix terminal'98 и ... не смог построить ядро.
Сругались на неопределенные ссылки в API псевдотерминалов (вроде openpts и
т.д.) ??? Может где еще надо чего сделать???
По программированию
3. Почитал info glibc на предмет открытия псевдотерминала и т.д. Hаписал
программу - все нормально псевдотерминал (первый номер из свободных открыл,
точнее занял номер) есть, но теперь надо туда запустить мою программу, эта
программа интерактивная не иксовая. Что делать? Hиже привожу пример, который
я написал, может он лучше покажет, что я сделал...
/*
* Попытка разобраться с псевдотерминалами
*
* Остапенко С. В.
* 991130
*
* Linux RH 6.0
* kernel 2.2.13
* egcs-1.1.2
*
*/
char* slave_name; /* name slave pseudo-terminal */
// Open master
if( (master = getpt()) < 0)
{
perror("Can't open master pts!n");
close(master);
exit(1);
}
// Changes ownership and permissions for master pseudo-terminal and unlock
slave
if( grantpt(master)<0 || unlockpt(master)<0 )
{
perror("Can't change ownership or permissions for master
pseudo-terminal!n");
close(master);
exit(1);
}
// Get name of slave
if( (slave_name = ptsname(master)) == NULL )
{
perror("Can't get name of slave pseudo-terminal!n");
close(master);
exit(1);
}
// Open slave
if( (slave = open(slave_name, O_RDWR)) == -1)
{
perror("Can't open slave pts!n");
close(master);
exit(1);
}
// Write to slave
// Вот здесь я и не понял. Hе работает. Что делать дальше?
if( write(slave, "Hello pts!n", 11) == -1 )
perror("Can't wrote to slave pts!n");
printf("n%sn", slave_name);
// execlp("xterm", 0);
// getchar();
close(slave);
close(master);
}
В общем задача следующая:
Есть менеджер задач, все задачи взаимодействуют с менеджером через
разделяемую память. Сам менеджер интерактивный - взаимодеиствует с
пользователем. Одна из запускаемых задач тоже интерактивная. Ее
ввод-вывод и надо выкинуть на другой терминал ( в моем случае на другой
х-терминал). Как? Принимаются все советы, нравоучения, ссылки и особенно
примеры.
PS. Подумал и решил добавить скошную задачу.
--
Thanks in advanced
Best regards. Serg
osix AT permonline DOT ru
osix AT raid DOT perm DOT ru