C 来自不兼容指针类型的赋值—;如何修复?
正在尝试实现信号处理程序,但收到警告:C 来自不兼容指针类型的赋值—;如何修复?,c,pointers,handlers,C,Pointers,Handlers,正在尝试实现信号处理程序,但收到警告: assignment from incompatible pointer type [enabled by default] act.sa_sigaction = sigChldHandler; 。。。我的教授也指出 char * argv[3]; argv[0]= GUESSER_PROGNAME; argv[2]= NULL; 这为3个char指针变量分配了内存,但它们并不特别指向任何地方 \文件1 #include "assign2Head
assignment from incompatible pointer type [enabled by default]
act.sa_sigaction = sigChldHandler;
。。。我的教授也指出
char * argv[3];
argv[0]= GUESSER_PROGNAME;
argv[2]= NULL;
这为3个char指针变量分配了内存,但它们并不特别指向任何地方
\文件1
#include "assign2Headers.h"
pid_t answererPid;
pid_t guesserPid;
int shouldRun = 1;
void sigAlrmHandler(int sig)
{
kill(answererPid,TIME_OVER_SIGNAL);
kill(guesserPid,TIME_OVER_SIGNAL);
shouldRun=0;
}
void sigChldHandler(int sig)
{
wait(NULL);
shouldRun=0;
}
int main(void){
struct sigaction act;
memset(&act, '\0', sizeof(struct sigaction));
act.sa_handler = sigAlrmHandler;
sigaction(SIGALRM, &act, NULL);
act.sa_sigaction = sighldHandler;
sigaction(SIGCHLD, &act, NULL);
char line[LINE_LEN];
char * argv[3];
argv[0]= GUESSER_PROGNAME;
argv[2]= NULL;
answererPid = fork();
if(answererPid == 0){
execl(ANSWERER_PROGNAME,ANSWERER_PROGNAME,(char*)NULL);
}
else{
sleep(1);
snprintf(line,LINE_LEN,"%d",answererPid);
guesserPid=fork();
if(guesserPid==0)
{
execl(GUESSER_PROGNAME,GUESSER_PROGNAME,argv[0],line,(char*)NULL);
}
else
{ alarm(NUM_SECONDS);
while(shouldRun)
sleep(1);
sleep(1);
sleep(1);
printf("launcher finished\n");
return (EXIT_SUCCESS);
}
}
}
\文件2
#include "assign2Headers.h"
int shouldRun = 1;
void timeoverhandler(int sig)
{ sleep(1);
printf("\nOh no! The time is up!\n");
printf("guesser finished\n");
shouldRun=0;
exit(EXIT_SUCCESS);
}
void winsignalhandler(int sig)
{
printf("\nCongratulations! You found it!\n");
shouldRun=0;
signal(WIN_SIGNAL,winsignalhandler);
}
void correctsignalhandler(int sig)
{
printf("Yay! That was right!\n");
signal(CORRECT_SIGNAL,correctsignalhandler);
}
void incorrectsignalhandler(int sig)
{
printf("Oops! That was wrong. Please restart from the beginning.\n"
"\nRe-starting from the beginning:\n");
signal(INCORRECT_SIGNAL,incorrectsignalhandler);
}
int main(int argc,char* argv[])
{
pid_t answererPid=atoi(argv[1]);
signal(TIME_OVER_SIGNAL,timeoverhandler);
signal(WIN_SIGNAL,winsignalhandler);
signal(CORRECT_SIGNAL,correctsignalhandler);
signal(INCORRECT_SIGNAL,incorrectsignalhandler);
while(shouldRun)
{ int guess;
printf("What would you like your next guess to be: 0 or 1? ");
scanf("%d",&guess);
if(guess==0)
kill(answererPid,ZERO_SIGNAL);
if(guess==1)
kill(answererPid,ONE_SIGNAL);
sleep(2);
}
printf("guesser finished\n");
return (EXIT_SUCCESS);
}
\文件3
//--- Common standard header files ---//
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
////--- Common constants: ---//
#define ZERO_SIGNAL SIGUSR1
#define ONE_SIGNAL SIGUSR2
#define CORRECT_SIGNAL SIGUSR1
#define INCORRECT_SIGNAL SIGUSR2
#define WIN_SIGNAL SIGINT
#define TIME_OVER_SIGNAL SIGTERM
#define GUESSER_PROGNAME "guesser"
#define ANSWERER_PROGNAME "answerer"
#define LINE_LEN 256
#define NUM_SECONDS 30
/---通用标准头文件---//
#包括
#包括
#包括
#包括
#包括
#包括
#包括
////---常用常数:---//
#定义零信号SIGUSR1
#定义一个信号SIGUSR2
#定义正确的信号SIGUSR1
#定义不正确的_信号信号SIGUSR2
#定义WIN_信号信号
#定义信号SIGTERM上的时间
#定义GUESSER\u PROGNAME“GUESSER”
#定义应答器\u程序名“应答器”
#定义第256行
#定义NUM_秒30
\文件4
//--- Inclusion of header files ---//
#include "assign2Headers.h"
//--- Definition of constants: ---//
#define PATTERN_LEN 4
//--- Definition of global vars: ---//
int answer;
int numCorrect = 0;
int shouldRun = 1;
//--- Definition of global fncs: ---//
void timeUpHandler (int sig
)
{
shouldRun = 0;
}
void guessHandler (int sig,
siginfo_t* infoPtr,
void* dataPtr
)
{
int toSendBack;
int userBit = (sig == ONE_SIGNAL);
int correctBit = ((answer >> numCorrect) & 0x1);
int isCorrect = (correctBit == userBit);
printf("position %d: userBit %d, correctBit %d\n",
numCorrect,userBit,correctBit
);
if (isCorrect)
{
numCorrect++;
if (numCorrect >= PATTERN_LEN)
toSendBack = WIN_SIGNAL;
else
toSendBack = CORRECT_SIGNAL;
}
else
{
numCorrect = 0;
toSendBack = INCORRECT_SIGNAL;
}
kill(infoPtr->si_pid,toSendBack);
}
int main (int argc,
char* argv[]
)
{
// I. Application validity check:
// II. Run program:
// II.A. Initialize random number generator and choice:
srand(getpid());
answer = rand() % (1 << PATTERN_LEN);
printf("(The answer is %d)\n",answer);
// II.B. Install signal handlers:
struct sigaction act;
memset(&act,'\0',sizeof(act));
act.sa_handler = timeUpHandler;
sigaction(TIME_OVER_SIGNAL,&act,NULL);
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = guessHandler;
sigaction(ZERO_SIGNAL,&act,NULL);
sigaction(ONE_SIGNAL,&act,NULL);
// II.C. Hand out while game still active:
while ( (numCorrect < PATTERN_LEN) && shouldRun )
sleep(1);
// III. Finished, return answer:
printf("answerer finished\n");
return(EXIT_SUCCESS);
}
/---包含头文件---//
#包括“assign2Headers.h”
//---常数的定义:---//
#定义模式4
//---全局变量的定义:---//
int答案;
int numCorrect=0;
int shouldRun=1;
//---全球FNC的定义:---//
void timeUpHandler(int-sig
)
{
shouldRun=0;
}
无效猜测处理程序(int-sig,
siginfo\u t*infoPtr,
void*dataPtr
)
{
int-toSendBack;
int userBit=(sig==一个_信号);
int correct位=((答案>>numCorrect)&0x1);
int isCorrect=(correctBit==userBit);
printf(“位置%d:用户位%d,更正位%d\n”,
numCorrect、userBit、correctBit
);
如果(不正确)
{
numCorrect++;
if(numCorrect>=模式)
toSendBack=赢_信号;
其他的
toSendBack=正确的信号;
}
其他的
{
numCorrect=0;
toSendBack=错误的_信号;
}
kill(infoPtr->si_pid,toSendBack);
}
int main(int argc,
字符*argv[]
)
{
//一、申请有效性检查:
//II.运行程序:
//II.A.初始化随机数生成器并选择:
srand(getpid());
answer=rand()%(1我猜您正在Linux上工作。从sigaction
manpage:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
原型void sigChldHandler(int sig)
与sa_sigaction
不匹配。因此发出警告
你可以用
sa_handler
设置信号处理程序功能或指定SIG_IGN
/SIG_DFL
操作
sa_sigaction
设置信号处理函数-如果用户需要访问更多详细信息,如用户上下文和siginfo
结构(发送方进程详细信息、信号类型等)。需要在sa_标志中设置sa_siginfo
,以用于此用途
对于您的情况,设置sa_处理程序可能就足够了。
在main()
中:
而且
对要设置的每个信号使用单独的sigaction
结构,除非需要相同的处理程序
不要混用sigaction()
和signal()
用法。坚持使用一种。也许,sigaction
是新的,它提供了比signal()
更多的功能
我猜您正在Linux上工作。从sigaction
manpage:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
原型void sigChldHandler(int sig)
与sa_sigaction
不匹配。因此发出警告
你可以用
sa_handler
设置信号处理程序功能或指定SIG_IGN
/SIG_DFL
操作
sa_sigaction
设置信号处理函数-如果用户需要访问更多详细信息,如用户上下文和siginfo
结构(发送方进程详细信息、信号类型等)。需要在sa_标志中设置sa_siginfo
,以用于此用途
对于您的情况,设置sa_处理程序可能就足够了。
在main()
中:
而且
对要设置的每个信号使用单独的sigaction
结构,除非需要相同的处理程序
不要混用sigaction()
和signal()
用法。坚持使用一种。也许,sigaction
是新的,它提供了比signal()
更多的功能
这一部分:
char * argv[3];
argv[0]= GUESSER_PROGNAME;
argv[2]= NULL;
对于argv[0]
无效。由于argv
是指针数组,因此在使用它们之前,需要确保这些指针指向某个位置
这可以通过以下方式实现:
或与/:
注意:malloc()
也应该被选中,失败时它可以返回NULL
。堆上分配的任何内存最后也应该是空闲的()
就清晰度而言,您可以替换:
#define GUESSER_PROGNAME "guesser"
与:
这一部分:
char * argv[3];
argv[0]= GUESSER_PROGNAME;
argv[2]= NULL;
对于argv[0]
无效。由于argv
是指针数组,因此在使用它们之前,需要确保这些指针指向某个位置
这可以通过以下方式实现:
或与/:
注意:malloc()
也应该被选中,失败时它可以返回NULL
。堆上分配的任何内存最后也应该是空闲的()
就清晰度而言,您可以替换:
#define GUESSER_PROGNAME "guesser"
与:
char*argv[3];argv[0]=GUESSER\u PROGNAME;argv[2]=NULL;
无法理解为什么要将字符串放入指针数组。@RoadRunner是的!他不需要malloc语句吗?char*argv[3];argv[0]=GUESSER\u PROGNAME;argv[2]=NULL;
无法理解为何将字符串放入指针数组。@RoadRunner是的!他不需要malloc语句吗?请演示如何在
const char *guesser_progname = "guesser";