Открыть файл в vi / vim на языке C - PullRequest
0 голосов
/ 07 мая 2020

Привет! Я новичок в языке C, извините за это. Моя программа должна создать новый экземпляр текстового редактора (например, vi) и открыть в нем файл, имя которого пользователь даст в качестве аргумента для вызова программы. Если пользователь не указывает имя файла для открытия, должна быть открыта «пустая» записная книжка.

Я уже сделал открытие редактора vi в C. И все, что мне нужно знать, можно ли открыть файл в vi или vim, используя C язык?

Вот мой код

#include <stdio.h>
#include <unistd.h>

int main (int argc, char *argv[]) {

    FILE *fp;
    int childpid;
    int count1 = 0, count2 = 0;

    fp = fopen(argv[1], "a");

    if(fp == NULL) {
        char *exe_name = "vi", *message = "Empty notebook is running.";
        char *exe_args[] = { exe_name, message, argv[0], NULL };
        execv("/usr/bin/vi", exe_args);
    }

    printf("Before it forks");

    sleep(5);

    childpid = fork();

    if(childpid == 0) {
        printf("This is a child process\n");
        while(count1 < 10) {
            printf("Child Process: %d\n", count1);
            sleep(1);
            count1++;
        } 
    } else {
        printf("This is the parent process\n");
        while(count2 < 20) {
            printf("Parent Process: %d\n", count2);
            sleep(1);
            count2++;
        } 
    }
    fclose(fp);
    return 0;
}

Большое спасибо!

1 Ответ

1 голос
/ 07 мая 2020

Да, вы определенно можете! Однако я бы сначала проверил, как вы открываете «пустой» блокнот. Ваш exec_args[] содержит следующее:

["vi", "Empty notebook is running.", argv[0], "\0"]

argv[0] - это имя вашего C исполняемого файла, поэтому давайте предположим, что это a.out. Итак, когда вызывается execv(), вы, по сути, выполняете следующую команду:

/usr/bin/vi Empty\ notebook\ is\ running a.out 

Вы открываете два файла для редактирования, файл под названием «Пустая записная книжка запущена». (Обратите внимание на косую черту, чтобы избежать пробелов в приведенной выше команде) и созданный вами исполняемый файл C. Я не думаю, что вы собираетесь открывать оба из них, поскольку обычно вам не следует связываться с самим исполняемым файлом. Кроме того, после внесения изменений в «Пустая записная книжка работает». файл, при следующем запуске программы вы увидите эти изменения!

Итак, я предлагаю вам вообще не передавать имя файла. Таким образом, vi открывается, как если бы сам пользователь никогда не передавал имя файла.

Чтобы открыть существующий файл (и ничего больше), вы можете просто добавить предложение и else в свою проверку дескриптор файла. Итак, код может выглядеть примерно так:

if(fp == NULL)
{
    char *exec_args[] = {"vi", NULL};
    execv("/usr/bin/vi", exec_args);
}
else
{
    char *exec_args[] = {"vi", argv[1], NULL};
    execv("/usr/bin/vi", exec_args);
}


...