我收到以下错误:
program.c:24:3: error: case label does not reduce to an integer constant
case proc_id[0]: //child process 1 pid
以下代码中的所有case语句:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
int proc_id[4];
int main(int argc, char *argv[]){
int i;
int proc=1;
for (i = 0; i < 3; ++i)
{
if(proc != 0){
proc = fork();
}
if (proc != 0)
{
proc_id[i]=proc;
}
}
switch(getpid()){
case proc_id[0]: //child process 1 pid
for (i = 0; i < l; ++i)
{
alarm(3);
kill(proc_id[1], SIGUSR1);
}
break;
case proc_id[1]: //child process 2 pid
for (i = 0; i < l; ++i)
{
alarm(6);
kill(proc_id[2], SIGUSR2);
}
break;
case proc_id[2]: //child process 3 pid
for (i = 0; i < l; ++i)
{
alarm(9);
kill(proc_id[0], SIGUSR1);
}
break;
case proc_id[3]: //parent pid
printf("parent\n");
break;
}
return(0);
}
void custom_handler(int signum){
kill(SIGINT, getppid());
printf("PID:%d \t Signal Number: %d\n", getpid(), signum);
}
void parent_handler(int signum){
++sigcount;
switch(sigcount){
case l:
kill(proc_id[0], SIGTERM);
break;
case l+3:
kill(proc_id[1], SIGTERM);
break;
case l+6:
kill(proc_id[2], SIGTERM);
kill(proc_id[3], SIGTERM);
break;
}
}
void sigterm_handler(int signum){
exit(0);
}
我有两个问题:
环境详情: 在ubuntu终端上使用gcc编译的程序。
答案 0 :(得分:4)
switch
标签在编译时进行评估,因此它必须是常量表达式。您不能将表达式计算为任何值。
如果您需要等效算法,则必须使用if
语句
答案 1 :(得分:3)
在
case proc_id[0]:
proc_id[0]
不是常数,而是变量。案例标签只能使用const
,例如:
case 10:
与其他case
语句类似。
如果您有变量,则唯一的选择是使用if-else
块。
int pid = getpid();
if ( pid == proc_id[0] )
{
for (i = 0; i < l; ++i)
{
alarm(3);
kill(proc_id[1], SIGUSR1);
}
}
else if ( pid == proc_id[1] )
{
for (i = 0; i < l; ++i)
{
alarm(6);
kill(proc_id[2], SIGUSR2);
}
}
else if ( pid == proc_id[2] )
{
for (i = 0; i < l; ++i)
{
alarm(9);
kill(proc_id[0], SIGUSR1);
}
}
else if ( pid == proc_id[3] )
{
printf("parent\n");
}