<глоток> 1 глоток> Известный только ему
Получил это решение из 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
Общий процесс добавит ошибку обработка этого базового процесса (псевдокод):
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), чтобы процессы читали и записывали соответствующие места. Закройте все оставшиеся файловые дескрипторы, которые дочерние процессы не должны видеть или блокировать после завершения работы. Выполните фактические дочерние процессы. Подождите, пока они закончатся, и готово!
Вот руководство по конвейерам UNIX, в частности, о том, как создавать конвейеры в архитектуре, подобной оболочке:
http://www.cse.ohio-state.edu/~mamrak/ CIS762 / pipe_lab_notes.html
Не так много полностью написанного кода, но он довольно хорошо описывает концепции.
Вы также можете загрузить исходный код практически для любой оболочки, например bash , tcsh , zsh и т. д.
Попробуйте прочитать исходный код Bash , чтобы узнать, как они это сделали.
Когда несколько лет назад мне нужно было создать аналогичную оболочку, я использовал книгу Практическое программирование Unix .
Это действительно полезно для примеров по многим темам IPC. У меня все еще есть копия на моем столе, на которую я время от времени ссылаюсь. При использовании от 2 до 9 долларов это довольно хорошее соотношение цены и качества.
Как бы то ни было, просто подумал, что стоит упомянуть об этом.
Здесь заметки о пайпе из класса системного программирования, который я изучал в прошлом семестре.
хорошо Это работает для меня. Надеюсь, это поможет вам:
/************************
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);
}
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.
ну, у меня нет ответа, но я работаю над той же проблемой банкомата. Поделюсь тем, что есть. Он работает для двух команд, но после его выполнения ввод / вывод прерывается. странным образом я еще не смог понять. вызовите сантехника!
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 ()