Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   using fork/execvp to catenate a file (http://www.go4expert.com/forums/using-fork-execvp-catenate-file-t5058/)

ohaqqi 2Jul2007 23:01

using fork/execvp to catenate a file
 
Hi guys,
I'm still working on my shell. I'm trying to implement a function typefile that will take a command line input as follows:

> type <file1>

This command will implement a catenation of file1, equal to the command cat <file1>

I need to use execvp() and fork() system calls to create a new process that will type/cat any text file. In my code below, the execvp() call in the function at the bottom gets me the following:

o-shell.c:128: warning: passing arg 2 of `execvp' from incompatible pointer type

I know for sure i'm calling execvp incorrectly, any tips/pointers would be great. I want to use /bin/cat followed by filename as the argument.

Code:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

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

        char command[50];                                //Command line input

        //tokens for strtok() funtion
        char * com;                                                //Primary command
        char * arg1;                                        //First argument of command (usually a file name)
        char * arg2;                                        //2nd argument of command (usually a file name)

        int args;                                                //Number of arguments entered

        //FUNCTION DECLARATIONS

        void typefile(char * filename);

        printf("***************************************************\n");
        printf("Welcome to O-Shell! A UNIX shell by O Haqqi\n\n");
        printf("Type 'help' for list of commands, 'exit' to exit\n");
        printf("***************************************************\n");

        for(;;)
        {

        printf("o-shell>");                                                //user prompts for o-shell

        fgets(command, 1024, stdin);                //command line input from user

        com = strtok(command, " \r\n\t");

        args = 0;
        arg1 = strtok(NULL, " \r\n\t");
        if(arg1) args++;                                                //to see if arguments being tracked
        arg2 = strtok(NULL, " \r\n\t");
        if(arg2) args++;                                                //to see if arguments being tracked

        if(com != NULL)                        //Can only execute commands if a command is entered
                                                        //Otherwise it keeps looping and printing prompt
        {
        printf("command entered: %s\n", com);
        printf("There are %d arguments\n", args);

        if ((strcmp(com,"help")) == 0 || (strcmp(com,"Help")) == 0)
        {
                printf("***************************************************\n");
                printf("\nO-Shell Help Menu:\n");
                printf("\nhelp - Print help menu\n");
                printf("\nexit - Exit O-Shell\n");
                printf("\ntype <file> - Print contents of <file> to terminal\n");
                printf("\ncopy <file1> <file2> - Copy contents of <file1> to <file2>.");
                printf("\n    <file2> must be a non-existent file and will be created\n");
                printf("\ndelete <file> - Delete <file> from system\n");
                printf("***************************************************\n");
        }

        else if ((strcmp(com,"exit")) == 0 || (strcmp(com,"Exit")) == 0)
        {
                printf("Exiting O-Shell...Goodbye!\n");

                //if exit command is entered, exit() system call is performed
                exit(1);
        }

        else if ((strcmp(com,"type")) == 0 || (strcmp(com,"Type")) == 0)
        {
                if((arg1 == NULL) || (arg2 != NULL))                //arg1 must exist, arg2 must be empty
                {
                        printf("Incorrect number of arguments! Type 'help' for correct format.\n");
                }

                else
                printf("Printing contents of file: %s\n", arg1);
                printf("***************************************************\n");

                typefile(arg1);                        //call typefile function (see below)
        }

        else
        printf("Invalid command!!! Type 'help' for list of valid commands.\n");

        }

        }

        return 0;
}

/************************************************************************************************
Function typefile() prints contents of a file to the terminal
Format: type <file1>
************************************************************************************************/

void typefile(char * filename)
{
        int pid, status;

        const char cat[] = "/bin/cat";

        pid = fork();

        if(pid < 0)
        printf("ERROR: Child pid = %i FORK FAILED! Please try again.\n", pid);

        else if(pid > 0)
        printf("ERROR: Child pid = %i Parent process executing, FORK FAILED!\n", pid);

        else if(pid == 0)                                //If the process id is zero, fork() was successful
        {
                printf("Child pid = %i FORK SUCCESSFUL...\n");

                execvp(cat, filename);
        }

}


DaWei 3Jul2007 01:47

Re: using fork/execvp to catenate a file
 
Quote:

Originally Posted by man page
The prototype: int execvp( const char *file, char *const argv[]);

The exect, execv, and execvp functions provide an array of
pointers to null-terminated strings that represent the
argument list available to the new program.

The first argument, by convention, should point to the file name
associated with the file being executed. The array of
pointers must be terminated by a NULL pointer.

Do you see yourself conforming to that?


All times are GMT +5.5. The time now is 09:33.