Почему execlp в child не возвращает ничего в stdout? - PullRequest
0 голосов
/ 12 мая 2019

У меня есть программа, которая читает строку за строкой из текстового файла.Каждая строка имеет макет

command arg1 arg2 arg3

, и я прочитал его так, что у меня есть 2 массива, 1 из которых содержит строку, а другой указывает на каждое строковое значение.например,

char read_in_line[128]
char* command[100]

и т. д .:

command[0] = command arg1 arg2 arg3
command[1] = command arg1 

и т. д.

Затем я получаю этот массив команд в качестве входных данных для функции, использующей fork и pipe.Ниже приведен фрагмент этой функции, и обратите внимание, что он находится в цикле while, который будет продолжаться, пока * cmd! = NULL

void piping(char* cmd[100]{

else if(pid == 0){
//child does not need to read
close(thepipe[0]);
dup2(thepipe[1],1);
close(thepipe[1]);
execlp(*cmd,*cmd,NULL);

Однако это ничего не возвращает.Моя C-программа компилируется без каких-либо ошибок, однако в моем stdout я не вижу выполнения ни одной из команд, которые я отправил в функцию.

EDIT:

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/wait.h>

    #define BUFFERSIZE 128
    #define oops(m,x) {perror(m); exit(x);}

    void piping(char **cmd[BUFFERSIZE]){
    pid_t pid;
    int thepipe[2];
    int in = 0;
    //while there are still commands
    while (*cmd != NULL){
        pipe(thepipe);
        //fork error case
        if((pid = fork()) < 0)
          oops("cannot fork",1);

        //child
        if(pid == 0){
            //child does not need to read
            close(thepipe[0]);
            if(dup2(thepipe[1],1)== -1)
              oops("Error redirecting stdout",2);
            //duplication succesful can now close thepipe[1]
            close(thepipe[1]);
            //execute the command
            execvp(*cmd[0], *cmd);
            exit(-1);
        }

        else{
          //parent does not write to pipe
          close(thepipe[1]);
          //setting up parent input to read from the pipe
          dup2(thepipe[0],0);
          close(thepipe[0]);

            //wait until child finishes
            wait(NULL);
            cmd++;
        }
    }
}

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

    char **command[BUFFERSIZE];
    char read_in_line[BUFFERSIZE];

    int i = 0;
    int counter =0;
    int counter2 =0;
    //reading in line by line until end of file is reached
    FILE* fp = fopen("test.txt","r");
    while( fgets(read_in_line, BUFFERSIZE, fp) != NULL ){
        int j = 0;
        //setting up memory for arguments given that we know there is a max
        //of 10 arguments per line
        char **arguments = (char**) calloc(16, sizeof(char*));
        command[i] = arguments;
        //Will break up the line read in when a newline is argument resulting in one
        //string containing the commands and arguments
        //this string will then be broken up every time a space is met so that
        //commands and arguments can be seperated, and saved to command[i][j]
        char *t = strtok(read_in_line, "\n");
        char *argument = strtok(t, " ");
        command[i][j] = strdup(argument);

        while(argument != NULL){
            argument =strtok(NULL, " ");

            if(argument != NULL){
                command[i][++j] = strdup(argument);
            }
        }
        i++;

    }


    piping(command);

    return (0);
}

1 Ответ

0 голосов
/ 12 мая 2019

Программа, представленная ниже, работает должным образом:


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/wait.h>


int main(void)
{
int rc;

rc=execlp("/bin/date", "deet", (char*) NULL);

printf("Rc=%d,%d(%s)\n", rc, errno, strerror(errno));

return 0;
}

Следующий шаг: добавьте несколько аргументов.(следующий шаг: исправить сантехнику)


rc=execlp("/bin/ls", "ls", "-li", (char*) NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...