2016-10-24 13 views
0

名前付きパイプを介して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; 
} 

私は正直なところ失われています。間違いがありましたら申し訳ありません。ネイティブスピーカーではありませんので、自分自身を明確に説明するのはちょっと難しいです。

答えて

1

私は問題があなたがフォークしてシグナルを処理する方法だと思います。

初めてpracがフォークすると、子供のpidがpid1に割り当てられました。 親(元prac)はscanf()を呼び出して待機します。

あなたの子プロセス(prac子は)再び()フォークを呼び出して、あなたはpid11prac孫)に孫のPIDを割り当てます。

次に親(元prac)を使用して孫(pid11)に信号を送信しようとしています。しかし、親は、孫の正しいpidを持っていません。孫は、親ではなく子のコードによって作成されるからです。親プロセス内のpid11は、依然としてコードで定義されていないデフォルト値です。

あなたには、いくつかの入力を入力するときに、親がkill()機能を実行し、pid11にデフォルト値が0であれば、それは同じプロセスグループID(kill()の参照)で、すべてのプロセスにシグナルを送ることを意味します。 pid11が0でない場合、信号は間違ったプロセスに送信されます。

また、孫プロセス用のシグナルハンドラのみをコーディングするため、親プロセスと息子プロセスの両方が強制終了されます。したがって誰もFIFOを読むつもりはない。

関連する問題