Helt framme är man inte...
Här är mitt testprogram:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include </usr/include/sys/filio.h>
int slaveToMasterPipe[2];
int masterToSlavePipe[2];
void ReadMessage(char * str)
{
int err;
long availableData;
availableData = 0;
err = ioctl(slaveToMasterPipe[0], FIONREAD, &availableData);
if (err != 0) printf("ioctl error\n");
else printf("Waiting: %d\n", availableData);
if (availableData > 0)
{
read(slaveToMasterPipe[0], &str[0], availableData);
str[availableData] = 0;
}
else
str[0] = 0;
}
void WriteMessage(char * s)
{
int theLength = strlen(s);
write(masterToSlavePipe[1], &s[0], theLength);
}
int main()
{
char str[1024], *cp;
pid_t pid;
int status, died;
FILE *mf, *sf;
pipe (masterToSlavePipe);
pipe (slaveToMasterPipe);
switch (pid=fork())
{
case -1: printf("can't fork\n");
exit(-1);
case 0 : // this is the code the child runs
close(0); // close stdin
dup (masterToSlavePipe[0]); // set stdin to read from pipe
close (masterToSlavePipe[1]);
close(1); // close stdout
dup (slaveToMasterPipe[1]); // points pipefd at file descriptor
close (slaveToMasterPipe[0]);
// Set buffering
setvbuf(stdout, 0, _IOLBF, 0); // stdout must not have full buffering.
// Hello.c:
// Works in same program
sleep(1);
fgets(str,100,stdin);
printf("Hello 1, I got: %s\n", str);
sleep(2);
fgets(str,100,stdin);
printf("Hello 2, I got: %s\n", str);
// Fails after exec:
// execl ("hello","hello",0);
break;
default: // this is the code the parent runs
close (slaveToMasterPipe[1]); // We don't write to incoming channel
close (masterToSlavePipe[0]); // We don't read from outgoing channel
// Now read from the pipe
printf("Now sending Pling!\n");
WriteMessage("Pling!\n");
sleep(2);
ReadMessage(str);
printf("Reply: %s\n", str);
printf("Now sending Plong!\n");
WriteMessage("Plong!\n");
sleep(2);
ReadMessage(str);
printf("Reply: %s\n", str);
died= wait(&status);
}
}
som jobbar mot den här:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
char str[1024], *cp;
sleep(1);
fgets(str,100,stdin);
printf("Hello 1, I got: %s\n", str);
sleep(2);
fgets(str,100,stdin);
printf("Hello 2, I got: %s\n", str);
}
Det översta programmet fungerar perfekt som det står, för det anropar aldrig det nerdre utan kör samma kod inom sig själv, men kommenterar man bort hello-koden och avkommenterar exec så blir det fel, då kommer allt i ett schok på slutet, dv buffringen går fel igen. Någonting är kvar, men vad?