execlp("madplay","madplay",str,"-r","-q",NULL);这句代码什么意思
时间: 2023-09-16 22:07:07 浏览: 51
这句代码是在C语言中使用的一个系统调用函数execlp(),它的作用是在当前进程中执行指定的程序,并将它替换为新程序。具体来说,这句代码会执行madplay这个程序,同时传递了一些参数,包括str、-r和-q。
其中,第一个参数"madplay"是要执行的程序的文件名,第二个参数"madplay"是argv[0],表示程序的名称,第三个参数str是要传递给madplay程序的第一个参数,表示要播放的音乐文件名,然后"-r"和"-q"是madplay程序的两个参数。
最后一个参数NULL表示参数列表的结束。当程序执行完毕后,控制权将返回给原来的程序。
相关问题
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:"); } }这一段代码有什么问题,如何修改
这段代码可能存在以下问题:
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");
}
}
```
execlp函数实现 ls -l -a 功能
可以使用 `execlp` 函数通过系统调用来执行 `ls -l -a` 命令,具体实现如下:
```c
#include <unistd.h>
int main()
{
execlp("ls", "ls", "-l", "-a", NULL);
return 0;
}
```
`execlp` 函数的第一个参数是要执行的程序名,第二个参数是程序名,第三个参数开始是程序的参数列表,参数列表必须以 NULL 结尾。在上面的例子中,我们传递了 `ls`、`-l` 和 `-a` 三个参数给 `ls` 命令,因此程序会执行 `ls -l -a` 命令。
需要注意的是,`execlp` 函数会取代当前进程,因此在执行完 `execlp` 后的代码不会被执行。如果 `execlp` 返回值为负数,则说明执行出错了。