Использование fork() и execlp для подсчета строк

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

Код следующий:

#include <stdio.h>
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdlib.h> 
#define exit_on_error(s,m) if (s < 0) { perror(m); exit(1); } 

int main(int argc, char *argv[]){
    int i, status, total=0, F, n=0;

    for(i=1; i<argc; i++){
        if(fork()==0){
            F=open(argv[i], O_RDONLY);
            exit_on_error(F,"Erro na abertura do ficheiro");
            if(fork()==0)
            {
                wait();

                // ?????????????                                  

                execlp("wc", "wc", "-l", NULL);
            }
            close (F);
            return (0);
        }
        else{
            wait(&status);
            total += status >> 8;
        }
    }


    for(i=1; i<argc; i++){
        printf("PID=(%d), Ficheiro %s\n", getpid(), argv[i]);
    }
    for(i=1; i<argc; i++){
        printf("Numero de linhas do ficheiro %s: [%d]\n", argv[i], n);
    }
    printf("Ficheiros: [%d]---Erros: [%d]\n", --argc, total);

}

И это показывает что-то вроде этого: название программы 2.c

./2 phonecontacts.txt ddd

Erro na abertura do ficheiro: нет такого файла или каталога

PID=(3565), Ficheiro phonecontact.txt (файл, содержащий 20 строк)

PID = (3565), Ficheiro DDD (этот не существует)

Numero de linhas do ficheiro phonecontact.txt: [0] (здесь должно было быть 20 строк)

Numero de linhas do ficheiro ddd: [0] (этот не существует)

Ficheiros: [2] --- Erros [1]

wc: стандартный ввод: ошибка ввода / вывода 0

1 ответ

Немного поработав, мне удалось решить мою проблему:

int main(int argc, char *argv[]){
        int i, status, total=0, F;

        for(i=1; i<argc; i++){
                if(fork()==0){
                        close(0);
                        F=open(argv[i], O_RDONLY);
                        exit_on_error(F,"Erro na abertura do ficheiro");
                        if(fork())
                        {
                                printf("Numero de linhas do ficheiro %s: \n", arg$
                                execlp("wc", "wc", "-l", NULL);
                        }
                        close (F);
                        return (0);
                }
                else{
                        wait(&status);
                        total += status >> 8;
                }
                printf("PID=(%d), Ficheiro %s\n", getpid(), argv[i]);
        }
        printf("Ficheiros: [%d]---Erros: [%d]\n", --argc, total);
}

Это код полностью функциональный.

Другие вопросы по тегам