I’m trying to execute the command “ls -l” but I’m not exactly sure how to approach it.
This is what I’ve tried:
int main(void) {
char * input;
char * args[2];
char buff[100];
input = malloc(sizeof(buff));
while(fgets(input,sizeof(input),stdin) != NULL) {
printf("Enter a commandn");
if(strcmp(input,"ls -ln") ==0) {
pid_t childPid;
childPid = fork();
if(childPid == 0) {
args[0] = "/bin/ls -l";
args[1] = NULL;
execv(args[0],args);
}
}
}
free(input);
}
However, the command doesn’t seem to work here. It works if I just simply use “ls” but I want to use “ls -l” is there another argument I have to pass to get this to work?
Advertisement
Answer
First you have to understand this simple example.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
/* status of child execution */
int status;
/* pointer * to array of char*(strings)*/
char ** args;
/* allocate memory for three char*(stings) */
args = (char**) malloc( 3 * sizeof(char*) );
/* fork program and store each fork id */
pid_t childPid = fork();
/* if this is child process */
if(childPid == 0) {
args[0] = "ls";
args[1] = "-l";
args[2] = NULL;
/* execute args[0] command with args arguments */
execvp(args[0],args);
/* send execution code 0 to parent and terminate child */
exit(0);
} else {
/* wait execution code from child*/
wait(&status);
/* free allocated space */
free(input);
free(args);
/* exit program with received code from child */
exit(status);
}
}
I commented every line, but tell me if you want more informations. You have to understand how to execute commands from child and inform parent before continue to user’s input commands.