无界面MP3:
功能实现:W -- 上一首 N -- 下一首 S -- 启动/恢复(播放) X -- 暂停 Q -- 退出
#include <stdio.h>
#include <glob.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
int main()
{
int ret = 0;
int i = 0;
//记录歌曲
int num = 0;
char ch = 0;
glob_t pglob;
pid_t pid;
//查找mp3文件
ret = glob("../音乐/*.mp3",0,NULL,&pglob);
if(ret == -1)
{
perror("glob error");
return -1;
}
//打印歌曲名
printf("找到以下歌曲:\n");
for(i = 0;i<pglob.gl_pathc;i++)
{
printf("%d..%s\n",i+1,pglob.gl_pathv[i]);
}
//创建子进程
pid = vfork();
while (1)
{
if(pid == -1)
{
perror("vfork error");
return -1;
}
else if(pid == 0)//子进程
{
printf("***************准备播放******************\n");
printf("w-上一首 n-下一首 x-暂停 s-恢复播放 q退出\n");
printf("请输入你的操作\n");
printf("***************正在播放******************\n");
printf("%s\n", pglob.gl_pathv[num]);
execl("/usr/bin/mpg123", "mpg123","-q", pglob.gl_pathv[num], NULL);
}
else//父进程
{
ch = 0;
next:
//读取操作
ch = getchar();
if(ch == -1)
{
perror("getchar");
goto next;
}
switch (ch)
{
case 'W':
case 'w':
kill(pid,9);
if(num == 0)
num = pglob.gl_pathc-1;
else
num--;
pid = vfork();
break;
case 'N':
case 'n':
kill(pid,9);
if(num >= (pglob.gl_pathc-1))
num=0;
else
num++;
pid = vfork();
break;
case 'x':
case 'X':
kill(pid,19);
break;
case 's':
case 'S':
kill(pid,18);
break;
case 'q':
case 'Q':
printf("欢迎下次使用\n");
kill(pid, 9); // 杀死当前进程
raise(9);
break;
default:
printf("输入错误!\n");
break;
}
}
}
return 0;
}