Запись моей собственной оболочки … застрявший на каналах?

  • Известный <глоток> 1 проблемы
  • Известный <глоток> 1 области улучшения
  • Существующие данные покрытия кода, протестируйте уровень передачи и т.д., чтобы использоваться в качестве базовой линии
  • Советы по устранению неисправностей (понимающий файлы журнала, отладив катастрофические отказы, общие глюки)
  • Объяснение параметров конфигурации

<глоток> 1 Известный только ему

16
задан 101010110101 24 September 2009 в 15:28
поделиться

9 ответов

Получил это решение из http://abcoder.com/javascript/jquery/simple-check-uncheck-all-jquery-function/ (теперь мертв) :

JavaScript и HTML-код

 var NUM_BOXES = 10; // последний флажок, на котором щелкнул пользователь var last = -1; function check (event) {// в IE объект события является свойством объекта окна // в Mozilla объект события передается обработчикам событий как параметр if (! event) {event = window.event} var num = parseInt (/ box \ [(\ d +) \] /. exec (this.name) [1]); if (event.shiftKey && last! = -1) {var di = num> last? 1: -1; for (var i = last; i! = num; i + = di) {document.forms. коробки ['box [' + i + ']']. checked = true; }} last = num; } функция init () {для (var i = 0; i 
  
10
ответ дан 30 November 2019 в 17:28
поделиться

Общий процесс добавит ошибку обработка этого базового процесса (псевдокод):

pipe(fds)
if (fork() is child) {
  dup2(fds[1], 1)
  close(fds[0])
  close(fds[1])
  exec("ls")
}
if (fork() is child) {
  dup2(fds[0], 0)
  close(fds[0])
  close(fds[1])
  exec("sort")
}
close(fds[0])
close(fds[1])
wait()

Сначала создайте канал. Затем создайте вилку дочерних процессов, чтобы они унаследовали его. Переназначьте дескрипторы файлов на 0 (stdin) и 1 (stdout), чтобы процессы читали и записывали соответствующие места. Закройте все оставшиеся файловые дескрипторы, которые дочерние процессы не должны видеть или блокировать после завершения работы. Выполните фактические дочерние процессы. Подождите, пока они закончатся, и готово!

6
ответ дан 30 November 2019 в 17:28
поделиться

Вот руководство по конвейерам UNIX, в частности, о том, как создавать конвейеры в архитектуре, подобной оболочке:

http://www.cse.ohio-state.edu/~mamrak/ CIS762 / pipe_lab_notes.html

Не так много полностью написанного кода, но он довольно хорошо описывает концепции.

Вы также можете загрузить исходный код практически для любой оболочки, например bash , tcsh , zsh и т. д.

5
ответ дан 30 November 2019 в 17:28
поделиться

Попробуйте прочитать исходный код Bash , чтобы узнать, как они это сделали.

2
ответ дан 30 November 2019 в 17:28
поделиться

Когда несколько лет назад мне нужно было создать аналогичную оболочку, я использовал книгу Практическое программирование Unix .

Это действительно полезно для примеров по многим темам IPC. У меня все еще есть копия на моем столе, на которую я время от времени ссылаюсь. При использовании от 2 до 9 долларов это довольно хорошее соотношение цены и качества.

Как бы то ни было, просто подумал, что стоит упомянуть об этом.

2
ответ дан 30 November 2019 в 17:28
поделиться

Здесь заметки о пайпе из класса системного программирования, который я изучал в прошлом семестре.

1
ответ дан 30 November 2019 в 17:28
поделиться

хорошо Это работает для меня. Надеюсь, это поможет вам:

/************************
function: void pipeCommand(char** cmd1, char** cmd2)
comment: This pipes the output of cmd1 into cmd2.
**************************/
void pipeCommand(char** cmd1, char** cmd2) {
  int fds[2]; // file descriptors
  pipe(fds);
  // child process #1
  if (fork() == 0) {
    // Reassign stdin to fds[0] end of pipe.
    dup2(fds[0], STDIN_FILENO);
    close(fds[1]);
    close(fds[0]);
    // Execute the second command.
    // child process #2
    if (fork() == 0) {
        // Reassign stdout to fds[1] end of pipe.
        dup2(fds[1], STDOUT_FILENO);
        close(fds[0]);
        close(fds[1]);
        // Execute the first command.
        execvp(cmd1[0], cmd1);
    }
    wait(NULL);
    execvp(cmd2[0], cmd2);
    }
    close(fds[1]);
    close(fds[0]);
    wait(NULL);
}
6
ответ дан 30 November 2019 в 17:28
поделиться

You are connecting each program's input to its own output. You probably wanted to connect each program's output to the next one's input instead.

Instead of going for the general case of n processes in a pipeline, you should start with a basis of two and expand from there. You'll gain a better understanding of the way the file descriptors are plugged into each other if you proceed by extending working code instead of shooting directly for the complex structure.

0
ответ дан 30 November 2019 в 17:28
поделиться

ну, у меня нет ответа, но я работаю над той же проблемой банкомата. Поделюсь тем, что есть. Он работает для двух команд, но после его выполнения ввод / вывод прерывается. странным образом я еще не смог понять. вызовите сантехника!

void pipeCommand(char** cmd1, char** cmd2) {
  int fds[2]; // file descriptors
  pipe(fds);
  int oldIn, oldOut;
  // child process #1
  if (fork() == 0) {
    // Reassign stdin to fds[0] end of pipe.
    oldIn = dup(STDIN_FILENO);
    dup2(fds[0], STDIN_FILENO);
    close(fds[1]);
    close(fds[0]);
    // Execute the second command.
    execvp(cmd2[0], cmd2);
  // child process #2
  } else if ((fork()) == 0) {
    oldOut = dup(STDOUT_FILENO);
    // Reassign stdout to fds[1] end of pipe.
    dup2(fds[1], STDOUT_FILENO);
    close(fds[0]);
    close(fds[1]);
    // Execute the first command.
    execvp(cmd1[0], cmd1);
  // parent process
  } else
    wait(NULL);
    dup2(oldIn, STDIN_FILENO);
    dup2(oldOut, STDOUT_FILENO);
    close(oldOut);
    close(oldIn);
}

У меня такое чувство, что это связано с тем, что я делаю или не делаю после wait ()

0
ответ дан 30 November 2019 в 17:28
поделиться
Другие вопросы по тегам:

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