应用与MPlayer通过slave模式进行信息交换

来源:互联网 发布:便携电脑推荐 知乎 编辑:程序博客网 时间:2024/06/05 15:20

应用与MPlayer通过slave模式进行信息交换

代码如下

编译方法

gcc test.c -lpthread

#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读取命令   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));//从无名管道的写端读取信息打印在屏幕上   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");//如果明明管道存在,则先删除   mkfifo ("/tmp/my_fifo", O_CREAT | 0666);perror ("mkfifo");if (pipe (fd_pipe) < 0)//创建无名管道   {perror ("pipe error\n");exit (-1);}pid = fork ();if (pid < 0){perror ("fork");}if (pid == 0)//子进程播放mplayer   {close (fd_pipe[0]);dup2 (fd_pipe[1], 1);//将子进程的标准输出重定向到管道的写端   fd_fifo = open ("/tmp/my_fifo", O_RDWR);execlp ("mplayer", "mplayer", "-slave", "-quiet", "-loop", "0", "-input", "file=/tmp/my_fifo", "/home/user/Downloads/text2audio.mp3", NULL);}else{pthread_t tid1;pthread_t tid2;fd_fifo = open ("/tmp/my_fifo", O_RDWR);if (fd < 0)perror ("open");pthread_create (&tid1, NULL, get_pthread, NULL);//从键盘获取控制信息   pthread_create (&tid2, NULL, print_pthread, NULL);//打印从无名管道收到的信息   pthread_join (tid1, NULL);pthread_join (tid2, NULL);}return 0;}


0 0
原创粉丝点击