2013-05-04 70 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