在此之前需要安装 mpg123(无界面的 mp3 播放软件)
安装:
在命令框下输入以下命令
sudo apt-get install mpg123
使用:
在终端输入:mpg123 曲目名( 如果曲目不在终端当前所处的路径下, 曲目名需要加上路径)
安装成功后打开编译器运行代码即可播放自定义路径下的音乐
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <glob.h>
#include <signal.h>
#include <dirent.h>
#include <sys/stat.h>
void fun (int a);
void caidan(void);
int i=0;
glob_t mp3={0};
pid_t pid=0;
int main()
{
printf("这是个没有界面的播放器\n");
glob("/home/ping/音乐/mp3文件/*.mp3",0,NULL,&mp3);//获取mp3文件
for(int i=0;i<mp3.gl_pathc;i++)
{
printf("%d\t%s\n",i,mp3.gl_pathv[i]);//打印这个目录下所有的mp3文件名
}
printf("输入你想要播放的音乐代码\n");
scanf("%d",&i);
while(getchar()!='\n');
pid=fork();//创建子进程
if(pid>0)//父进程执行函数
{
signal(17,fun);//信号改造函数
while(1)
{
caidan();
}
}
if(pid==0)//子进程执行函数
{
execlp("mpg123","mpg123",mp3.gl_pathv[i]);//播放mp3音乐
}
return 0;
}
void fun (int a)
{
if(i<0)//防止i值过小
{
printf("此歌序号为最小\n");
i=0;
}
if(i>=mp3.gl_pathc)//防止i值过大
{
printf("此歌序号为最大\n");
i=mp3.gl_pathc-1;
}
int num=0;
pid_t p=waitpid(pid,&num,WNOHANG);//判断子进程是否是正常退出
if(p==pid)
{
if(WIFEXITED(num))//正常退出,播放下一首
{
i++;
pid=fork();//重新创建子进程
if(pid==0)
{
execlp("mpg123","mpg123",mp3.gl_pathv[i]);
}
}
else//不正常退出
{
pid=fork();//重新创建子进程
if(pid==0)
{
execlp("mpg123","mpg123",mp3.gl_pathv[i]);
}
}
}
}
void caidan(void)
{
printf("请输入你想要的操作\n");
printf("w--上一曲\tn--下一曲\ts--暂停\nb--播放\t\tq--退出播放器\n");
char choose=0;
scanf("%c",&choose);
while(getchar()!='\n');
switch(choose)
{
case'w':
i--;
kill(pid,14);//发送14号信号杀死子进程
break;
case'n':
i++;
kill(pid,14);//发送14号信号杀死子进程
break;
case's':
kill(pid,19);//发送19号信号暂停代码运行
break;
case'b':
kill(pid,18);//发送18号信号继续代码运行
break;
case'q':
signal(17,SIG_IGN);//取消信号改造函数
kill(pid,9);//结束进程
system("stty echo");
printf("\033[?25h");//回显
return;
break;
default:printf("输入有误!!!\n");
break;
}
}