I wrote a simple program which will create a child process to execute a command and the output will be redirected to the file.

Please have a look at the following code ->

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>

void execute(char **argv)
{
pid_t pid;
int status;

int fStdOutDesc = open("/tmp/outfile", O_CREAT | O_RDWR, S_IREAD | S_IWRITE);
int fStdErrDesc = open("/tmp/errfile", O_CREAT | O_RDWR, S_IREAD | S_IWRITE);

printf("Out file Desc dup2 is %d\n",fStdOutDesc);
printf("Err file Desc dup2 is %d\n",fStdErrDesc);

if ((pid = fork()) < 0) /* fork a child process */
{
printf("ERROR: forking child process failed...\n");
exit(1);
}

else if (pid == 0) /* for the child process: */
{
dup2(fStdOutDesc, fileno(stdout));
dup2(fStdErrDesc, fileno(stderr));

if (execvp(*argv, argv) < 0) /* execute the command */
{
printf("ERROR: exec failed...\n");
exit(1);
}
}
else /* for the parent process: */
{
while (wait(&status) != pid) ; /* wait for completion */
}
}

int main(void)
{
char cmd[1024];
char *argv[64];

printf("Enter the Command : ");
scanf("%s",&cmd); /* works for ls & doesn’t work for vgscan */
printf("\n");
argv[0]=cmd;
argv[1]='\0';
execute(argv);
return 0;
}



After running above program, it will prompt for an input (command), if you enter “ls”, the output of the “ls” command is redirected to /tmp/outfile, whereas after entering vgscan, there will not be anything in either /tmp/outfile or /tmp/errfile.

This problem is particularly with few commands like vgscan, pvscan, vgdisplay, lvdisplay etc whereas these commands give output if ran through shell.

This is the case for only Oracle Enterprise Linux. The same program works fine on other Linux versions.

Any help regarding this would be very much helpful.