Nieoczekiwane działanie wielokrotnego potokowania programu cat we wzorcowej powłoce

Odp: Nieoczekiwane działanie wielokrotnego potokowania programu cat we wzorcowej powłoce

Napisane przez: Patrycja Balik ()
Liczba odpowiedzi: 0
Można dodać wrapper setpgida, który brutalnie ignoruje EACCES, żeby łatwiej przyglądać się drugiemu przypadkowi.
int setpgid(pid_t pid, pid_t pgid) {
  static pid_t (*setpgid_orig)(pid_t pid, pid_t pgid) = NULL;
  setpgid_orig = dlsym(RTLD_NEXT, "setpgid");
  int rt;
  if ((rt = setpgid_orig(pid, pgid) < 0) && errno == EACCES) {
    return 0;
  }
  return rt;
}
Wydaje się, że występuje wyścig, i proces dostaje SIGTTIN zanim nastąpi tcsetpgrp w rodzicu, bo rodzic wisi na sigsuspend. Dokumentacja GNU libc o kontroli zadań mówi:
If the job is being launched as a foreground job, the new process group also needs to be put into the foreground on the controlling terminal using tcsetpgrp. Again, this should be done by the shell as well as by each of its child processes, to avoid race conditions.
Co może być lub nie być użyteczne.