gpt4 book ai didi

c - 努力通过信号在进程之间进行通信

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:48 25 4
gpt4 key购买 nike

我正在尝试在 linux 终端下用 C 语言创建一个游戏。

我需要创建一个包含两个 c 文件的俄罗斯方 block 游戏,一个 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是第二个文件的输出文件。

我在第二个文件中创建了信号处理器,但是程序仍然没有收到信号,我做错了什么?

最佳答案

这个片段:

while(true) kill(0,SIGUSR2);

没有意义。 kill 应该与 SIGUSR2 接收者的进程 ID 一起使用(在本例中为子进程,由 pid 标识)。另请注意,向子进程发送信号的无限循环并不是您想要的。

在子进程中,您在信号处理程序的打印语句中出现错误:

printf("Received SIGUSR1!\n");

应该是

printf("Received SIGUSR2!\n");

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

注意:你同步的是进程,不是线程

关于c - 努力通过信号在进程之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16375538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com