- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在 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/
我正在尝试为我的项目创建一些单元测试,经过大量挖掘之后,我发现了Effort,这个想法很棒,它模拟数据库而不是处理伪造的DBContext,顺便说一句,很难做到正确使用复杂的架构。 但是,我将用户的电
我正在尝试对某些响应 Entity Framework 数据库上下文的类进行单元测试。为了寻求帮助,我设法找到了一个名为 Effort 的库,它似乎有点旧,而且没有很好的文档记录,但它似乎可以工作,而
这两天,Auto-GPT 爆火 https://github.com/Torantulino/Auto-GPT 它是一款让最强语言模型GPT-4能够自主完成任务的模型,让整个AI圈疯
为什么会出现这个异常?这是错误吗? 我正在使用 EF 测试库 Effort 创建我的数据库的内存实例并遇到这个有趣的场景: 打开DbContext1 将项目添加到表(不保存) 关闭DbContext1
我是一名优秀的程序员,十分优秀!