Использование execlp для вставки вместе содержимого многих файлов - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь использовать execlp и разветвленные процессы для вставки групп файлов. Я придумал что-то вроде этого:

  for(int i=0; i<pair_counter; i++){
       int out_f = open(C[i],O_WRONLY);

       pid_t child = fork();
         if(child==0){
           char buffer[1000];
           dup2(out_f,1);
           close(out_f);
             sprintf(buffer, ".tmp/part%d*", i);
         execlp("paste",buffer,NULL);

         }
    }

, и это выдает такие ошибки, как:

.tmp / part0 *: -: Ошибка ввода / вывода

в то время как стандартная версия с использованием system () работает правильно:

for(int i=0; i<pair_counter; i++){
            char *buffer = calloc(1000, sizeof(char));
            sprintf(buffer, "paste .tmp/part%d* > %s", i, c_filenames[i]);
            system(buffer);
        }

Я новичок в c и Lnux, поэтому буду очень признателен за любую помощь.

1 Ответ

0 голосов
/ 02 апреля 2020

Команда paste ожидает имена файлов, а не шаблоны, в качестве аргументов. Когда вы набираете что-то вроде «вставить часть1 *» в приглашении оболочки, оболочка раскрывает шаблон «часть1 *» в набор имен файлов (например, часть11 часть1.а часть1 и более) и вызывает вставку со всеми эти имена. Было много написано о unix концепциях и синтаксисе оболочки, поэтому вы сможете легко их найти.

Если вы измените свою программу на:

 sprintf(buffer, "paste .tmp/part%d*", i);
 execlp("/bin/sh", "sh", "-c", buffer, NULL);

Она должна работать , Я не совсем попробовал это сделать, но вы точно не опубликовали полную проблему, так что ...

#include <stdio.h>
#include <unistd.h>
int main() {
    char buffer[1000];
    sprintf(buffer, "paste *.c");
    return execlp("/bin/sh", "sh", "-c", buffer, 0) ? 1 : 0;
}

Это полная версия, которую вы можете сделать всего за минуту то, что

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...