2013-05-04 68 views
1

即時通訊試圖在C終端下創建一個遊戲。努力與信號進程之間的溝通

我需要創建一個包含兩個c文件的俄羅斯方塊遊戲, 一個C文件創建執行文件(a.out),另一個創建(draw.out)。 第一個程序創建一個子進程並執行另一個。

我需要發送信號到其他程序,但我發現它很困難。

的源代碼是:

第一文件級

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <stdbool.h> 
#include <termios.h> 
#include <signal.h> 

char getch(); 

int main() 
{ 
    int fd[2],pid; 
    char *args[] = { "./draw.out", NULL },tav; 
    pipe(fd); 
    pid=fork(); 
    if(pid==0) 
    { 
     execve("draw.out", args, NULL); 

    } 
    else 
    { 

     while(true) 
      kill(0,SIGUSR2); 
    } 

    return 1; 
    //getchar(); 

} 

char getch() { 
     char buf = 0; 
     struct termios old = {0}; 
     if (tcgetattr(0, &old) < 0) 
       perror("tcsetattr()"); 
     old.c_lflag &= ~ICANON; 
     old.c_lflag &= ~ECHO; 
     old.c_cc[VMIN] = 1; 
     old.c_cc[VTIME] = 0; 
     if (tcsetattr(0, TCSANOW, &old) < 0) 
       perror("tcsetattr ICANON"); 
     if (read(0, &buf, 1) < 0) 
       perror ("read()"); 
     old.c_lflag |= ICANON; 
     old.c_lflag |= ECHO; 
     if (tcsetattr(0, TCSADRAIN, &old) < 0) 
       perror ("tcsetattr ~ICANON"); 
     return (buf); 
} 

第二文件 -

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <stdbool.h> 
#include <signal.h> 


typedef struct 
{ 
    int x; 
    int y; 
}Point; 

typedef struct 
{ 
    Point dots[3]; 
}Tool; 

void drawBoard(int array[][20]); 
void initBoard(int array[][20]); 
Tool retrieveTool(); 
bool changeLocation(int array[][20],Tool* tool); 
void my_handler(int signum); 

int main() 
{ 
    bool nextTool=true; 
    Tool temp=retrieveTool(); 
    int gameBoard[20][20]; 
    signal(SIGUSR2, my_handler); 
    initBoard(gameBoard); 
    changeLocation(gameBoard,&temp); 
    drawBoard(gameBoard); 
    while(true) 
    { 
     signal(SIGUSR2, my_handler); 
     sleep(1); 
     system("clear"); 
     if(!changeLocation(gameBoard,&temp)) 
      temp=retrieveTool(); 
     drawBoard(gameBoard); 
    } 
    return 1; 
    //getchar(); 

} 

void initBoard(int array[][20]) 
{ 
    bool isLast=false; 
    int i=0,j=0; 
    for(i=0;i<20;i++) 
    { 
     if(i==19) 
      isLast=true; 
     for(j=0;j<20;j++) 
     { 
      if((j==0)||(j==19)||(isLast)) 
       array[i][j]=1; 
      else 
       array[i][j]=0; 
     } 
    } 
} 

void drawBoard(int symbols[][20]) 
{ 
    int i=0,j=0; 
    for(i=0;i<20;i++) 
    { 
     for(j=0;j<20;j++) 
      if(symbols[i][j]==1) 
       printf("*"); 
      else 
       if(symbols[i][j]==2) 
        printf("-"); 
       else 
        printf(" "); 
     printf("\n"); 
    } 
} 

Tool retrieveTool() 
{ 
    Tool temp; 
    int startX=0,startY=8,i=0; 
    for(i=0;i<3;i++) 
    { 
     temp.dots[i].x=startX; 
     temp.dots[i].y=startY; 
     startY++; 
    } 
    return temp; 
} 

bool changeLocation(int array[][20],Tool* tool) 
{ 
    int i=0; 
    for(i=0;i<3;i++) 
    { 
     if(array[tool->dots[i].x+1][tool->dots[i].y]!=0) 
      return false; 
    } 
    i=0; 
    for(i=0;i<3;i++) 
    { 
     array[tool->dots[i].x][tool->dots[i].y]=0; 
     if((tool->dots[i].x+1)==19) 
      tool->dots[i].x=-1; 
     tool->dots[i].x++; 
     array[tool->dots[i].x][tool->dots[i].y]=2; 
    } 
    return true; 
} 

void my_handler(int signum) 
{ 
    if (signum == SIGUSR2) 
    { 
     printf("Received SIGUSR1!\n"); 
    } 
} 

的draw.out是該第二文件的輸出文件。

我在第二個文件中創建了信號處理程序, 但程序仍然沒有收到信號,我在做什麼錯?

謝謝, Asaf。

+0

爲什麼你是否每次通過循環都重新安裝信號處理程序? – 2013-05-04 15:08:55

回答

1

這個片段:

while(true) kill(0,SIGUSR2); 

有沒有意義。 kill應該與SIGUSR2的reveiver的進程ID一起使用(在這種情況下,子進程由pid標識)。還要注意,發送信號給子進程的無限循環並不是你想要的。

在子過程中,可以在打印語句錯誤的信號處理程序:

printf("Received SIGUSR1!\n"); 

應該

printf("Received SIGUSR2!\n"); 

根據不同的操作系統版本,您必須重新安裝信號處理程序一旦它被稱爲

注意:您正在同步進程,而不是線程

+0

嗯,我嘗試發送pid變量殺死,但它仍然不會調用「my_handler」函數。這個函數應該是一個俄羅斯方塊遊戲,第二個程序運行在一個循環中,所以我希望第二個程序每次都檢查信號。那爲什麼我從一個循環中發出程序編號1的信號,我應該怎麼做呢? – 2013-05-04 15:00:56

+0

而printf沒有任何意義,我只是爲了檢查信號是否工作於信號處理程序的printf函數 – 2013-05-04 15:01:45

+1

通常被認爲是不可靠的。它應該工作,但是可以從處理程序可靠地調用的一組函數是相當有限的。 – 2013-05-04 15:06:28