LINUX.ORG.RU

История изменений

Исправление shaplov, (текущая версия) :

Я ее таки победил.

Ключевым моментом в понимании была статья https://blog.nelhage.com/2011/02/changing-ctty/ рекомендую всем заинтересованным лицам.

То что пытался сделать я, в примере я дочерний процесс выдирал в отдельную сессию. И по какой-то причине reptyr с этим не справлялся. А вот если выдрать дочерний процесс в отдельную группу в рамках той же сессии, то reptyr это уже осиливает. Делается это вызовом setpgid($$,$$) который назначает процесс группой самому себе.

Суммарно код примера выглядит так:

#!/usr/bin/perl

use strict;
use POSIX;

my $pid = fork();
if ($pid)
{ 
  print "$pid\n";
  sleep 10;
  while (1) {print ".\n"; sleep 1};
} else
{
  my $i=0;
   (setpgid($$,$$) != -1)           || die "Can't create own group: $!";
  sleep 10;
  while (1) {print "$i\n"; sleep 1; $i++};
}

Он напечатает в консоли pid дочернего процесса, и в другой консоли надо дать команду

$ reptyr [это самый pid]

В результате точки из родительского процесса станут печататься в старой консоли, а циферки из дочернего процесса – в новой. Чего собственно говоря и хотелось добиться…

Исходная версия shaplov, :

Я ее таки победил.

Ключевым моментом в понимании была статья https://blog.nelhage.com/2011/02/changing-ctty/ рекомендую всем заинтересованным лицам.

То что пытался сделать я, в примере я дочерний процесс выдирал в отдельную сессию. И по какой-то причине reptyr с этим не справлялся. А вот если выдрать дочерний процесс в отдельную группу в рамках той же сессии, то reptyr это уже осиливает. Делается это вызовом setpgid($$,$$) который назначает процесс группой самому себе.

Суммарно код примера выглядит так:

#!/usr/bin/perl

use strict;
use POSIX;

my $pid = fork();
if ($pid)
{ 
  print "$pid\n";
  sleep 10;
  while (1) {print ".\n"; sleep 1};
} else
{
  my $i=0;
   (setpgid($$,$$) != -1)           || die "Can't start a new session: $!";
  sleep 10;
  while (1) {print "$i\n"; sleep 1; $i++};
}

Он напечатает в консоли pid дочернего процесса, и в другой консоли надо дать команду

$ reptyr [это самый pid]

В результате точки из родительского процесса станут печататься в старой консоли, а циферки из дочернего процесса – в новой. Чего собственно говоря и хотелось добиться…