2015-04-01 3 views
-2

Я пытаюсь прочитать ввод из определенного файла и записать его в определенный файл с помощью unix (sys calls). выходная часть должна быть каким-то образом создана.пытается перенаправить ввод и вывод с использованием системных вызовов

я хочу сделать что-то вроде следующего: ./a.out < input.txt> output.txt используя только эти функции: вилки, dup.dup2, EXEC, открытым, писать, читать код это:

pid_t pid, runner; 
char *path = argv[1]; 
char enter[] = "/home/demo/Desktop/OS/Ex1/Ex12/code/input.txt"; 
char to[] = "/home/demo/Desktop/OS/Ex1/Ex12/Ex1/ronen/"; 
char *out = "/home/demo/Desktop/OS/Ex1/Ex12/Ex1/ronen/out1.txt"; 
char *args[] = {to, "./a.out","<",enter,">",out, NULL}; 
char *args2[] = {"cd", to, "./a.out","<",enter,">",to ,NULL}; 
if ((runner = fork()) < 0) {perror("could not make fork");} 
else if (runner == 0) { 
    printf("true\n"); 
    execvp(args2[0],args2); 
} else if (runner != 0) { 
    waitpid(runner,0,0); 
    printf("done\n"); 
} 

Так что это действие, когда я помещаю файл «a.out» на рабочий стол.

однако кто-нибудь знает, как я могу перенаправить функцию exec, чтобы перейти в мою специальную папку? поэтому мне не придется передавать исполняемый файл на рабочий стол?

+0

Вы не понимаете понятия 'shell' и' syscall'. Сначала вы должны попытаться лучше понять, что такое системные вызовы и что делает оболочка перед написанием кода. Например, вы пытаетесь передать командную строку оболочки в ядро. Это бессмыслица, оболочка ** отвечает за перевод командной строки в правильные аргументы в последовательность fork/exec. – fjardon

+0

Ваш вопрос: * Как написать программу, в которой запускается вторая программа, чей стандартный ввод и вывод перенаправляются на файлы? * – fjardon

ответ

0

Для чтения и записи файлов вы просто используете обычные функции read и write; сначала вам понадобится дескриптор файла, поэтому вам нужно будет использовать fopen.

В целом, каждый учебник C, который я когда-либо видел, охватывает открытие и письмо задолго до того, как он коснется fork, поэтому мне интересно, за чем вы следовали. Я бы просто рекомендовал найти введение в C, которое вам нравится, и прочитать первые несколько страниц; если вы уже понимаете, что делает fork, это будет кусок пирога для вас.

EDIT: кроме того, вы могли бы неправильно понять, что

program arguments <from_file >to_file 

делает при использовании, что на раковине:

оболочки читает эту строку, и вызывает program, передавая ему arguments, как. .. аргументы. Он обнаруживает < и > на этой линии и «изгибает» стандартные дескрипторы входных и выходных файлов (да, стандартный ввод и вывод ведут себя так же), чтобы быть фактически fopen ed файлов.

program не видит <from_file, а не >to_file.

EDIT в вашем комментарии вы говорите:

я не могу использовать FOPEN и эти функции. только .fork, dup.dup2, EXEC, открытым, писать, читать

Очевидно, что fopen является лишь оболочкой для open и возвращает файл дескриптора open возвращается.

Кроме того, ваша программа использует множество функций libc; если вам разрешено только write, вы не должны использовать printf, что является очень удобной форматирующей оболочкой для puts, которая является оберткой для write. Аналогичные вещи относятся к всем функциям, которые вы вызываете, т.е. waitpid, execvp, perror. Вы должны четко указать свои требования для себя, первый.

+0

Привет, прежде всего, за комментарии! , но я не могу использовать fopen и эти функции. только .fork, dup.dup2, exec, open, write, read – user3253375

+0

Я не понимаю, как сделать команду "./a.out output.txt" с помощью вызова sys dup – user3253375

0

Я предполагаю, что ваш вопрос: Как написать программу, которая запускает вторую программу, чей стандартный ввод и вывод перенаправляются на файлы?

В этом случае вам необходимо выполнить следующую последовательность:

В основной программе

  • вилка() дочерний процесс
  • ждать() для дочернего процесса с использованием ПИД-регулятора полученные от fork()

В подпроцессе ребенка

  • близко (0) стандартный входной
  • открыт() входной файл (с режимом чтения)
  • близко (1) стандартный вывод
  • открыт() выходной файл (с записью режим)
  • Exec() целевая программа

Как использовать системные вызовы

R EAD Т он F ине М anuals

Эта страница содержит пример кода. И, читая их все, у вас должно быть достаточно кода примера для написания всей вашей программы.

+0

мой вопрос касается exec которую я не понимаю. Например, , например, я хотел бы использовать coomand «a.out» и только эту команду. какие аргументы я должен передать функции execvp. Спасибо. – user3253375

Смежные вопросы