I have a program that reads in line by line from a text file. Each line has the layout

command arg1 arg2 arg3

and I have read it in so that I have 2 arrays, 1 which contains the string and another which points to each string value. eg

char read_in_line[128]
char* command[100]

and so:

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

etc.

I then have this command array as an input to a function that uses fork and pipes. The following is a snippet of this function and note it is in a while loop which will continue 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);

However, this does not return anything. My C program compiles without showing any errors, however in my stdout I can not see the execution of any of the commands i sent into the function.

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 Answers

0
wildplasser On

The program below works as expected:


#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;
}

Next step: add some arguments. (next step: fix the plumbing)


rc=execlp("/bin/ls", "ls", "-li", (char*) NULL);