Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 来自不兼容指针类型的赋值—;如何修复?_C_Pointers_Handlers - Fatal编程技术网

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";