I have been stuck with this problem on and off since last night and I’m hoping a second fresh pair of eyes will help.
The problem, if an invalid input is entered in the userIn function (anything that isn’t a number between 1-99) the test printf at the end of the while loop in main prints “ERR = 1”, the while loops and userIn is called again. So far so good, but when a valid input is entered the test printf at the end of the while loop prints “ERR = 0” and then the program hangs. The test printf saying “HELLO” never gets printed.
Any suggestions as to why are most welcome.
The code:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void userIn (int *x)
{
char b;
printf("Please enter a new value for Vm: ");
scanf(" %i",x);
while (((b=getchar())!='\n')&&(b!=EOF));
return;
}
int main (void)
{
int fd, x, err;
char *npipe = "/tmp/fms",
input[3];
struct stat info;
printf("\n");
//get user input
err = 1;
while (err)
{
userIn(&x);
if (x > 0 && x < 100) err = 0;
//else printf("\033[1A\033[K");
printf("ERR = %i\n",err);//TEST PRINTF
}
printf("HELLO");//TEST PRINTF
//if pipe exists
if ( (!lstat(npipe,&info)) && (S_ISFIFO(info.st_mode)) )
{
sprintf(input,"%i",x);
//write user input to named pipe created by 'parent.c'
fd = open(npipe, O_WRONLY);
write(fd, input, sizeof(input));
close(fd);
}
else printf("\033[0;31mNamed pipe doesn't exist, %i not passed.\n\n\033[0m",x);
return 0;
}
If I run your code on my system the output looks like this:
That is, the loop exits exactly when you think it should. Of course, the code then exits immediately because
/tmp/fmsdoes not exist on my system.However, if I create
/tmp/fms, then I see:…and no additional output. This is because the output from the
printfstatement is buffered, and the write to the named pipe is blocking, so the output never gets flushed. Adding a\nto your printf will probably display it as you expect.