перенаправление входного выходного файла и каналы оболочки в простой программе оболочки, реализованной с - PullRequest
0 голосов
/ 15 февраля 2012

Я написал программу, которая получает аргументы командной строки, такие как ls, cat, и выполняет их.Теперь мне нужно расширить эту программу для перенаправления ввода-вывода, а также выполнить shell-каналы.Вот моя программа для простой оболочки.

if ((pid = fork()) == -1 ) { /* error exit - fork failed */ 
    perror("Fork failed");
    exit(-1);
}
if (pid == 0) { /* this is the child */
    printf("This is the child ready to execute: %s\n",argv[1]);
    execvp(argv[1],&argv[1]);
    perror("Exec returned");
    exit(-1);
} else {
    wait(pid,0,0);
    printf("The parent is exiting now\n");
    ...
}

Я не знаю, как добавить каналы и перенаправление в этой же программе!

dup(pipeID[0]);
close(pipeID[0]);
close(pipeID[1]);
execlp(argv[3],argv[3],argv[4],0); 

Я знаю, что должен использоватьdup() или dup2() для перенаправления и pipe() тоже, но как мне сделать все это вместе в одной программе?

1 Ответ

1 голос
/ 15 февраля 2012

Есть много вопросов SO, которые касаются некоторых или всех этих проблем. Более релевантные поисковые термины в поисковом буфере SO: [c] [shell] (теги shell и C). Вопросы включают в себя:

  1. Написание собственной оболочки на C: как запустить исполняемые файлы Unix?
  2. Перенаправление вывода дочернего процесса?
  3. Как я могу реализовать свою собственную базовую оболочку Unix в C?
  4. Написание Linux-оболочки?
  5. Оболочка программы и трубы в C?

Возможно, вы найдете лучший выбор, если будете стараться изо всех сил.


Есть ряд вопросов, которые вам нужно решить:

  • Трубы должны быть настроены перед форком, который создает два процесса, соединенных трубой.
  • Перенаправление ввода / вывода может выполняться только у ребенка.
  • Вам необходимо проанализировать командную строку, чтобы разделить ее на имена команд, аргументы и перенаправления ввода / вывода.
  • Вы должны быть осторожны, чтобы гарантировать, что достаточное количество дескрипторов файла канала будет закрыто (обычно это все к тому времени, как вы закончите).
  • С учетом конвейерной линии sort file1 file2 | uniq -c | sort -n, какой процесс или процессы ожидает родительская оболочка? Все они? Только первый? Только последний? Почему?
  • Решения по предыдущему пункту будут влиять на число каналов, открытых в родительском элементе, по сравнению с числом, открытым дочерними элементами. Вы всегда можете установить все необходимые каналы в родительском элементе, и позволить всем делать множество закрытий. Если вы собираетесь ждать только последнего процесса, вы можете оптимизировать так, чтобы у данного процесса в цепочке было самое большее его входной канал и его выходной канал открыт. Не тривиально, но выполнимо.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...