void play() { char *str=NULL; switch(CtrFlag) { case 0: { pid = fork(); if(pid==0) { str = strcat(cur_song->path,cur_song->name); //printf("\n%s\n",str); close(0);// //execlp("madplay","madplay",str,"-r","-q",NULL);//execlp会开辟一个新的线程覆盖掉子线程 system(“madplay str -r -q”); //execlp("play","play",str,"-r","-q",NULL);//execlp会开辟一个新的线程覆盖掉子线程 //execlp("mocp","mocp",str,"-r","-q",NULL);//execlp会开辟一个新的线程覆盖掉子线程 } CtrFlag = 2; } break; case 1: kill(pid,18);//对于主进程控制继续播放 CtrFlag = 2; break; case 2: { CtrFlag = 1; if(pid>0) { kill(pid,19);//主进程中暂停子进程 } } break; default: printf("play:"); } }这一段代码有什么问题,如何修改
时间: 2023-12-11 17:02:21 浏览: 29
这段代码可能存在以下问题:
1. 在第一个 case 中,使用了 strcat 函数将字符串拼接到了 cur_song->path 中,这可能会导致程序崩溃或不可预期的行为。应该使用 sprintf 函数或者手动将字符串拼接起来。
2. system 函数中传入的字符串常量应该使用双引号而不是中文引号。
3. 在第二个 case 中,kill 函数的第二个参数应该是 SIGCONT 而不是 18。
4. 在第四个 case 中,缺少了错误信息的输出。
修改后的代码如下:
```
void play() {
char str[1024];
switch(CtrFlag) {
case 0: {
pid = fork();
if(pid == 0) {
sprintf(str, "%s%s", cur_song->path, cur_song->name);
close(0);
execlp("madplay", "madplay", str, "-r", "-q", NULL);
perror("madplay");
exit(1);
}
CtrFlag = 2;
break;
}
case 1:
kill(pid, SIGCONT);
CtrFlag = 2;
break;
case 2: {
CtrFlag = 1;
if(pid > 0) {
kill(pid, SIGSTOP);
}
break;
}
default:
printf("play: unknown CtrFlag\n");
}
}
```