最近想在linux平台下写一款音乐播放器,找了一下,没有其他的解决办法,于是想调用mmplayer的代码来达到播放音乐的目的,然后开始写了之后,发现需要用的技术还挺多的。包括,多线程编程,多进程编程,进程间通讯,线程间通讯,条件变量,互斥量,线程锁,有名管道以及无名管道,权当复习一下linux系统调用编程,下面我把代码复制到下面,大家参考一下,相关的资料在网上都能找得到。
#include <stdio.h>
#include <stdlib.h>#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
int fd_fifo; //有名管道,用于和mplayer通讯
int fd_pipe[2];//无名管道,用于打印mplayer输出的消息
//发送到mplayer的线程
void *get_pthread(void *arg)
{
char buf[100];
while(1)
{
printf("please input you cmd:");
fflush(stdout);
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)]=0;
printf("*%s*\n",buf);
if(write(fd_fifo,buf,strlen(buf)) != strlen(buf))
perror("write");
}
}
//打印消息,在此可以添加消息处理函数
void *print_pthread(void *arg){
char buf[100];
close(fd_pipe[1]);
int size = 0;
while(1)
{
size = read(fd_pipe[0],buf,sizeof(buf));
if (size == 0) {
return 1;
}
buf[size] = 0;
printf("th msg read form pipe is %s\n",buf);
}
}
int main(int argc,char *argv[])
{
int fd;
char buf[100];
pid_t pid;
//断开管道
unlink("/tmp/my_fifo");if( mkfifo("/tmp/my_fifo",O_CREAT|0666) < 0)
{
perror("mkfifo");
}
if(pipe(fd_pipe) < 0)
{
perror("pipe");
exit(-1);
}
pid = fork();
if(pid < 0)
{
perror("fork");
exit(-1);
}
char buf[10];
atoi()
if(pid == 0) //子进程
{
close(fd_pipe[0]);
dup2(fd_pipe[1],1);
if(fd_fifo = open("/tmp/my_fifo",O_RDWR) < 0)
{
perror("son fd_fifo");
}
execlp("mplayer","mplayer","-slave","-quiet","-input",\
"file=/tmp/my_fifo","ge.wav","-loop","0",NULL);
}
else
{
pthread_t tid1;
pthread_t tid2;
fd_fifo=open("/tmp/my_fifo",O_RDWR);
if(fd_fifo<0)
{
perror("open my_fifo");
}
pthread_create(&tid1,NULL,get_pthread,NULL);
pthread_create(&tid2,NULL,print_pthread,NULL);
pthread_join(tid1,NULL); //等待线程结束
pthread_join(tid2,NULL);
}
return 0;
}