2015-04-29 3 views
0

Я пытаюсь выполнить команду sort < in.txt> out.txt, поэтому я использую dup2. Это мой код:Использование dup2 из файла в другой файл

int fdin = open("in.txt",O_RDWR); 
    int fdout = open("out.txt",O_RDWR); 

    dup2(fdin,fdout); 
    //close(fdin); 
    //close(fdout); 
    //execvp... 

Как именно dup2 работает? Я не могу это получить ... Спасибо!

+3

[Прочитайте страницу вручную] (http://man7.org/linux/man-pages/man2/dup2.2.html)? –

+0

Да, мой друг, поэтому я публикую здесь, потому что мне трудно понять. –

ответ

0

Способ, которым вы пользуетесь, снова закрывает fdout, удаляя его подключение к fdout, а затем его подключает к fdin. Так что если fdin и fdout, возможно, 4 и 5, оба 4 и 5 теперь указывают на in.txt.

Вместо того, что вы должны сделать что-то вроде

dup2(fdin, 0) // now 0 will point to the same as fdin 
dup2(fdout, 1) // now 1 will point to the same as fdout 
close(fdin); // as we don't need these any longer - if they are not 0 or 1! That should be checked. 
close(fdout); 
execvp(...); 

Есть некоторые другие подводные камни, которые необходимо принять помощь, однако. Например, вы должны fork() перед этим, если вы хотите, чтобы ваш процесс продолжал то, что он делает.

Почему этот комментарий на close() выше? Ну, когда ваш процесс не будет fd 0 и/или 1 открыт (что было бы необычным, но не невозможным), fdin может быть 0 или 1 и fdout может быть 1. Эти ситуации вам нужно решать.

Еще лучше было бы

if (fdin > 0) { 
    dup2(fdin, 0); // now 0 will point to the same as fdin 
    close(fdin); 
} 
if (fdout > 1) { // cannot be 0! 
    dup2(fdout, 1) // now 1 will point to the same as fdout 
    close(fdout); 
} 
execvp(...); 
+0

Я использую то, что вы рекомендовали, но все еще не работает. Я помещал комментарии close() в комментарии, потому что я не знал, когда их закрыть. Я использую fork раньше, кстати. Что происходит даже с вашим кодом, так это то, что программа выводит отсортированное содержимое in.txt на экране –

+0

Я нашел проблему, спасибо! –

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

  • Нет связанных вопросов^_^