Где я могу найти информацию о древнем doshell (8)?

Необходимо найти это get volume settings возвратит объект, содержащий среди прочего выходной объем и аварийный объем. Так, например, Вы могли сделать это для получения всего объекта:

osascript -e 'get volume settings'

или скорее возможно, это для захвата просто выходного объема (например, а не аварийного объема):

osascript -e 'set ovol to output volume of (get volume settings)'

... но обратите внимание, что не все аудиоустройства будут иметь прямое программное управление по параметрам громкости. Например, Ваше аудио дисплея должно иметь контроль; однако, firewire или USB i/o плата, вероятно, не имели бы тех настроек при программном управлении (так как они могли бы быть физическими кнопками). Если конкретная установка не будет находиться под контролем программного обеспечения затем, то это обнаружится в объекте, возвращенном из get volume settings как "отсутствующее значение" или что-то как этот.

3
22.04.2014, 02:31
1 ответ

Я не уверен (это было давно), но мне кажется, что это отсылка к старой программе Linux (1992): ftp://ftp2.de.freebsd.org/pub/linux/tsx-11/sources/usr.bin/doshell.c :

#include <stdio.h>
#include <sys/file.h>
#include <errno.h>

extern char *sys_errlist[];

main(int argc, char *argv[])
{

    if (argc != 3) {
    fprintf(stderr, "usage: doshell <ttyname> <shellname> &\n");
    exit(1);
    }

    /* close down fd's */
    close(0);
    close(1);
    close(2);

    /* detach from parent process's group */
    setsid();

    /* open new tty */
    if (open(argv[1], O_RDWR, 0) == -1)
    exit(2);
    dup(0);
    dup(0);
    execlp(argv[2], "-", 0);
    /* should appear on new tty...: */
    fprintf(stderr, "can't exec shell: %s\n", sys_errlist[errno]);
    exit(3);
}

Это также может относиться к старой подпрограмме Minux: http://users.sosdg.org/~qiyong/mxr/source/commands/mail/mail.c#L702

void doshell(command)
char *command;
{
  int waitstat, pid;
  char *shell;

  if (NULL == (shell = getenv("SHELL"))) shell = SHELL;

  if ((pid = fork()) < 0) {
        perror("mail: couldn't fork");
        return;
  } else if (pid != 0) {        /* parent */
        wait(&waitstat);
        return;
  }

  /* Child */
  setgid(getgid());
  setuid(getuid());
  umask(oldmask);

  execl(shell, shell, "-c", command, (char *) NULL);
  fprintf(stderr, "can't exec shell\n");
  exit(127);
} 

Обе подпрограммы, похоже, имеют функциональность, описанную в ответе stackoverflow, и это не кажется маловероятным первый произошел от второго.

3
27.01.2020, 21:23

Теги

Похожие вопросы