0

Cでサーバークライアントを使用して三目並べゲームを作成しようとしています。サーバー側では、FIFO(名前付きパイプ) 2 pid から読み取る必要があります。そのため、(fifo からの) 読み取りがゼロ以外の値を返すまで実行されるループを作成しました (クライアントが pid を fifo に書き込んだことを意味します)。

何らかの理由で、私のラップトップでは機能せず、友人のラップトップでは機能していると言わざるを得ません。同じコード!! なぜこれが起こっているのかわかりません。

そして、最初の while ループに body を追加して printf("1"); を配置すると、初期化。それは機能し、pid1 は FIFO から pid を読み取ります。

サーバーのコード:

#include <stdio.h>
#include <sys/stat.h> 
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>

void main()
{
    int fd,shmid;
    key_t shmkey;
    void *shm_add;
    pid_t pid,pid1=0,pid2=0;
    mkfifo("fifo_clientTOserver",400);
    fd=open("fifo_clientTOserver",O_NONBLOCK | O_RDONLY);
    pid=fork();
    if(pid==0)
    {
        while(read(fd,&pid1,sizeof(pid_t))==0); //(1) 
    }
    else
    {
        wait();
        while(read(fd,&pid2,sizeof(pid_t))==0)
        {
            if(pid2!=pid1)
                break;
        }   
        remove("fifo_clientTOserver");
    }
    printf("\nfirst pid= %d\nsecond pid= %d\n",pid1,pid2);
}

クライアントのコード:

#include <stdio.h>
#include <sys/stat.h> 
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <stdbool.h>

void my_handler(int signum);

bool over=false;
int board[3][3]={{0,0,0},{0,0,0},{0,0,0}};
char tav;
static bool first=false;

void main()
{
    int fd;
    pid_t pid1=getpid();
    signal(SIGUSR2, my_handler);
    fd=open("fifo_clientTOserver",O_WRONLY);
    write(fd,&pid1,sizeof(pid_t));
    printf("%d\n",pid1);
    while(!over);

}

void my_handler(int signum)
{
    char geth;
    printf("1");
    //Check if the signal is SIGUSR2.
    if (signum == SIGUSR2)
    {
    if(!first)
    {
        tav='x';
        printf("x");
        first=true;
    }
    else
    {
        tav='c';
        printf("c");
    }
    }
}

それは本当に奇妙で、私はそれに対処する方法がわかりません!行(1)を変更するwhile(read(fd,&pid1,sizeof(pid_t))==0){printf("1");} と、機能pid1して値が取得されます。

私を助けてください。

4

2 に答える 2