C копирование файлов с использованием только системных вызовов, бесконечное время выполнения - PullRequest
0 голосов
/ 11 марта 2019

Так что я работаю над простой программой на C, но застрял в части копирования.Программа принимает два имени файла в командной строке в качестве аргументов и копирует первое во второе с помощью системных вызовов.Если второй файл существует, он спрашивает пользователя, хотят ли они перезаписать, если нет, то создает его.Однако моя программа, когда пользователь выбирает перезапись, работает бесконечно.

Вот мой код:

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd1, fd2;
    char buffer[1024];
    long int n;
    char c;
    int num;

    if (argc != 3) {
        printf("%d\n",argc);
        printf("Error, you need to give 2 arguments. Such that [File to copy] [File to create].\n");
        exit(1);
    }

    if (access(argv[1], F_OK) < 0) {
        printf("File %s either does not exist or cannot be accessed.\n", argv[1]);
        exit(1);
    } else {
        printf("file %s exists\n", argv[1]);
    }

    if (access(argv[2], F_OK) < 0) {
        printf("File %s does not exist, but one will be created.\n", argv[1]);
        fd2=open(argv[2],O_CREAT|O_WRONLY|O_TRUNC, 0700);
    } else {
        printf("file %s exists\n", argv[2]);
        printf("Would you like to overwrite %s? (Type 1 for yes or 0 for no)\n", argv[2]);
        scanf("%d%c", &num, &c);  // use c to capture \n
        if (num == 1) {
            fd2=open(argv[2],O_CREAT|O_WRONLY|O_TRUNC, 0700);
        } else { 
            if (num == 0) {
                printf("Ok, the file will not be copied and the program will now exit.\n");
                exit(1);
            } else {
                printf("I do not recognize this response, program will now be terminated.\n");
            }
        }
    }
    printf("step\n");
    while ((n1 = read(fd1, buffer, 1024)) > 0) {
        printf("step\n");
        if(write(fd2, buffer, n1) != n1){
            printf("step\n");
            perror("Error writing file.");
            printf("step\n");
            exit(3);
        }
        printf("stepss\n");
    }
    close(fd1);
    close(fd2);
}

printf ("шаг") предназначен для отладки, но он печатает только одну.Это означает, что программа зависает в цикле while.Я могу использовать stat (), open (), read (), write (), close () и access ().Будем благодарны за любые идеи о том, что не так или как это можно сделать лучше!

1 Ответ

2 голосов
/ 11 марта 2019

Любые идеи о том, что не так

Ваш fd1 никогда не был назначен, поэтому read(fd1, ...) возвращает ошибку.

Проверьте возвращаемое значение read и printf("%m\n") напечатает детали.

$ ./a.out a b
file a exists
file b exists
Would you like to overwrite b? (Type 1 for yes or 0 for no)
1
step
Bad file descriptor
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...