I’m writing a program in which I use the system call fork() to create a child process, and then create a grandchild, as well as creating a pipe between the child and grandchild. I think my implementation is fairly good, however when I run the program, it simply skips right through the prompts in my code.
Essentially we have this:
-Process starts
Fork() create child
Child creates pipe
Fork() creates grandchild, pipe inherited.
TL;DR- Code skips through UI prompts, not sure if I’m entering data correctly, not sure if I’m reading data into processes correctly.
How do I read inputs down the pipe?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
void main(int argc, char *argv[])
{
int p[2];
int pid, pid2;
pid = fork();
if(pid == 0)
{
pipe(p);
pid2 = fork();
switch(pid2)
{
case -1:
printf("CASE 1");
exit(-1);
case 0:
close(0);
dup(p[0]);
close(p[0]);
close(p[1]);
execl("./Sort/sort", 0);
break;
default:
close(1);
dup(p[1]);
close(p[1]);
close(p[0]);
execl("./Pre/pre", 0);
break;
}
}
else
{
wait(pid);
printf("Process Completed\n");
exit(0);
}
}
Child process for pre:
#include <stdio.h>
void main (int argc, char *argv[])
{
char n1[20];
int g1;
FILE *ofp, *ifp;
int track;
ofp = fopen("output.txt", "w");
while(track != -1)
{
printf("Please enter the student's grade and then name, ");
printf("separated by a space: ");
scanf("%3d %s", &g1, n1);
if (g1 >= 60)
{
fprintf(ofp, "%s\n", n1);
}
printf("Add another name?(-1 to quit, 0 to continue): ");
scanf("%d", &track);
}
fclose(ofp);
ifp = fopen("output.txt", "r");
printf("Students that made a 60+:\n");
while(fscanf(ifp, "%s", n1) == 1)
printf("%s\n", n1);
fclose(ifp);
Child process for sort:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int stringcmp(const void *a, const void *b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
return strcmp(*ia, *ib);
}
void main(int argc, char *argv[])
{
int i = 0;
int num = 0;
int j = 0;
char name[20];
printf("How many names would you like to enter? ");
scanf("%d", &num);
char **input = malloc(num * sizeof(char*));
for (i=0; i < num; i++)
{
printf("Please input a name(first only): ");
scanf("%s", name);
input[i] = strdup(name);
}
qsort(input, num, sizeof(char *), stringcmp);
printf("Names:\n");
for(j = 0; j < num; j++)
printf("%s\n", input[j]);
for( i = 0; i < num; i++ ) free(input[i]);
free(input);
Observe that
preoutputs prompts to stdout. That text will end up in the pipe, which is going to end up insort‘sstdin.You should
fprintfall your prompts tostderr.prealso doesn’t output text in the format expected bysort;sortexpects an integernfollowed bynwords (first names). So, that should be the only text thatpreoutputs onstdout; everything else needs to go to a file orstderr.P.S. Also, use
dup2(p[0], 0)instead ofclose(0); dup(p[0])as it makes your intent clearer, as well as potentially avoiding threading issues (of course only relevant if you have threads, but it’s worth keeping in mind).