名前付きパイプを介して2つのプロセス通信を試行しています。これは次のようになります。まず最初に私のプロセス "prac"をn chidls(現時点ではちょうど1)にフォークします。これらの子孫は、execl(dadesPrac)を呼び出さなければならない時にシグナル彼の親に文字列をFIFOを通して書き込まなければなりません。問題は、FIFOに滞留書き込みがあるようです。 私は端末経由でメッセージが表示されない:2つのプロセス間のFIFO通信c
"printf("%s \ n "、バッファ)
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#define MAX_BUF 64
#include <string.h>
#include <errno.h>
#include <signal.h>
int main(int argc, char **argv){
int fd;
char buffer[MAX_BUF] = "";
char aux[MAX_BUF] = "";
int MaxTemp;
printf("%s , %s , %s \n",argv[0],argv[1],argv[2]);
if(argc == 3){
srand(time(NULL));
MaxTemp = (rand() % 50) + 10;
printf("I'M IN EXEC\n");
sprintf(aux,"%i",MaxTemp);
printf(" MAXTEMP %s\n",aux);
strcat(buffer,aux);
strcat(buffer,argv[2]);
printf("what i'm gonna write is %s\n",buffer);
fd = open(argv[1],O_WRONLY);
write(fd, buffer, sizeof(MAX_BUF));
printf("i finally wrote %s\n",buffer);
close(fd);
//unlink(argv[1]);
}else{
perror(" number of parameters incorrect");
}
printf("i'm gonna exit\n");
_exit(0);
}
プロセスPRACのコードは以下の通りです:
EXECLのパラメータを介して、FIFOの「名前」を取得writtesプロセスはprevoiusly、それはこのように書き、言いました
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#define MAX_BUF 64
#include <string.h>
#include <errno.h>
#include <signal.h>
int senyal = 0;
void empezar(int signum){
senyal++;
}
void make_fifo(char * myfifo){
/* crea l'arxiu fifo en cas de que ja no existeixi previament*/
int m;
if ((m = mkfifo(myfifo, 0666)) < 0){
if (errno != EEXIST){
perror ("mkfifo");
}
}
}
int main(int argc,char **argv) {
int m;
int pid11;
int fd, pid1,pid2,pid3,auxint,auxint2,status;
char * npipe1 = "/tmp/npipe1";
char buf[MAX_BUF];
char aux[MAX_BUF];
pid1 = fork();
if(pid1 == 0){
//child1
make_fifo(npipe1);
pid11 = fork();
if(pid11 == 0){
//grandson1
printf("inside grandson \n");
signal(SIGUSR1,empezar);
while(!senyal){
printf("im in the while\n");
sleep(1);
}
printf("i'm out of the while\n");
sprintf(aux,"%i",getpid());
execl("./dadesPrac","dadesPrac",npipe1,aux,NULL);
}
printf("almost waitpid\n");
wait(NULL);
printf("after waitpid\n");
fd = open(npipe1,O_RDONLY);
read(fd, buf, sizeof(MAX_BUF));
close(fd);
printf("%s",buf);
//do sql stuff
}
printf("i'm in dad \n");
scanf("%i",&auxint2);
kill(pid11,SIGUSR1);
wait(NULL);
return 0;
}
私は正直なところ失われています。間違いがありましたら申し訳ありません。ネイティブスピーカーではありませんので、自分自身を明確に説明するのはちょっと難しいです。