努力在具有信号的过程之间进行通信

时间:2013-05-04 14:48:56

标签: c linux terminal signals pipe

我试图在Linux终端下用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是第二个文件的输出文件。

我在第二个文件中创建了信号handeler, 但该计划仍然没有收到信号,我做错了什么?

1 个答案:

答案 0 :(得分:1)

这个片段:

while(true) kill(0,SIGUSR2);

毫无意义。 kill应该与SIGUSR2的发明者的进程id一起使用(在这种情况下,子进程由pid标识)。另请注意,向子进程发送信号的无限循环不是您想要的。

在子进程中,信号处理程序的print语句出错:

printf("Received SIGUSR1!\n");

应该是

printf("Received SIGUSR2!\n");

根据操作系统版本的不同,您必须在调用信号处理程序后重新安装

注意:您正在同步进程,而不是线程