FTXUI 终端简易音乐播放器
这次我们来写一个简单的音乐播放器界面。它有一个输入框,用户填写音乐文件的路径,按下播放键,音乐就会开始播放,并且播放按钮变成停止按钮。按下停止按钮,音乐停止,播放按钮又会重新出现。
为此,我们会启动一个新的进程用来播放音乐。用新进程播放音乐的好处就是,就算播放的时候什么都做不了,也不会影响到用户界面的运行。用户界面会继续接收用户的输入和刷新界面。
那么,这次还会涉及一些多进程的知识。
首先我们要明确一点,“fork”函数在父进程和子进程中的返回值是不同的。在父进程中,“fork”返回新创建的子进程的进程PID,而在子进程中,“fork”返回0。所以,“pid”变量在父子进程中的值是不同的:在父进程中,它是子进程的“PID”;在子进程中,它是0。
这段代码中,“PID”的初始值设为0,表示没有子进程。当第一次点击按钮时,会调用“fork”生成一个子进程。在父进程中,“fork”返回的是子进程的PID,这个值被赋给pid变量;而在子进程中,“fork”返回的是0,这意味着此时的pid变量仍然是0。
进程相关的部分主要集中在“Button”的回调函数里。这个回调函数定义了当用户点击按钮时应该执行的操作。
如果用户首次点击按钮,即“pid”为0,“fork”被调用并创建一个新的子进程。在子进程中,“E-X-E-C-L-P”函数被调用,它用于替换当前进程的映像(即当前正在执行的程序)。在这个例子中,子进程的映像被替换为“MPG一二三”程序,并传入File Name作为参数,这就启动了音乐播放。之后,按钮的标签从"Play"变为"Stop"。
如果用户再次点击按钮(即pid 不等于 0,也就是已经有一个子进程在运行),则“kill”函数被调用,向子进程发送一个“Kill”信号,这会导致子进程终止。然后,pid被设置为0,按钮的标签再次变为"Play"。
这个程序依赖于"mpg123"来播放音频文件,确保安装了"mpg123"~