Date: Tue, 23 Mar 1999 13:08:08 +0000 From: Mark Ovens <marko@uk.radan.com> To: hackers@freebsd.org Subject: Problem with fork() in 3.1 Message-ID: <36F79238.5FC1DA7C@uk.radan.com>
next in thread | raw e-mail | index | archive | help
Hi, Firstly, my apologies if this is an inappropriate question to post here, but I have asked in -questions and received no response and I am completely stumped. If anyone could spare a couple of minutes to look at this for me I would be very grateful (my learning curve is currently flat-lining). I have been learning about Inter Process Comms and have written the 2 progs included below. It all worked under 2.2.8 however when I u/g to 3.1-R (from the CD) it no longer works :-(. Under 2.2.8 the output was: % demo RESULT! - Circumference-106.814150 % however, under 3.1 this happens: % demo RESULT! - % The string returned from d2c doesn't appear. This happens (in 3.1) with both the 2.2.8 compiled progs (aout) and the 3.1 compiled progs (ELF). If I add ``sleep(5)'' to both progs ``ps'' confirms that the exec()'d program (d2c) is running. Someone else posted a message to -questions with exactly the same problem using rfork(). FWIW, as well as working under 2.2.8, these programs run properly under SunOS 4.1.3. BTW. I realize that this code is not good enough for real-world applications but, as I said, I'm learning so starting simple seems that best way. TIA for your time. -----file - demo.c-------- #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <sys/types.h> #include <sys/uio.h> #include <unistd.h> void main() { int fd[2]; int df[2]; pid_t pid; char input[BUFSIZ], result[BUFSIZ]; if (pipe(fd) < 0) { perror("pipe failed"); exit(EXIT_FAILURE); } if (pipe(df) < 0) { perror("pipe failed"); exit(EXIT_FAILURE); } if ((pid = fork()) < 0) { perror("fork failed"); exit(EXIT_FAILURE); } if (pid > 0) /* parent */ { close(fd[0]); close(df[1]); read(df[0], input, BUFSIZ - 1); if (strstr(input, "Diameter")) write(fd[1], "34\n", 3); read(df[0], result, BUFSIZ - 1); fprintf(stderr, "RESULT! - %s\n", result); close(fd[1]); close(df[0]); } else { /* child */ if (fd[0] != STDIN_FILENO) { if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO) { perror("dup2 fd[0] failed"); exit(EXIT_FAILURE); } } if (df[1] != STDOUT_FILENO) { if (dup2(df[1], STDOUT_FILENO) != STDOUT_FILENO) { perror("dup2 df[1] failed"); exit(EXIT_FAILURE); } } close(fd[1]); close(df[0]); if (execvp("./d2c", NULL) < 0) { perror("execvp failed"); exit(EXIT_FAILURE); } close(fd[0]); /* Don't think these are really needed */ close(df[1]); /* as execvp() only returns on failure */ /* & then exit() will be called above */ } } -----file - d2c.c---------- #include <stdio.h> #include <stdlib.h> #include <float.h> #define PI 3.141592653 int main(void) { double circ; char input[BUFSIZ]; printf("%s", "Diameter: "); fflush(stdout); fgets(input, BUFSIZ-1, stdin); circ = atof(input) * PI; printf("Circumference-%f\n", circ); fflush(stdout); return(0); } ----------------------------------- -- FreeBSD - The Power To Serve http://www.freebsd.org My Webpage http://www.users.globalnet.co.uk/~markov _______________________________________________________________ Mark Ovens, CNC Apps Engineer, Radan Computational Ltd. Bath UK CAD/CAM solutions for Sheetmetal Working Industry mailto:marko@uk.radan.com http://www.radan.com To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?36F79238.5FC1DA7C>