通过管道向mplayer发送数据时程序崩溃

时间:2013-08-10 21:52:24

标签: c pipe mplayer

我有一个用C编写的程序用管道启动mplayer,然后通过该管道控制mplayer。似乎有时当我通过管道发送命令时它会崩溃。以下是我的代码的相关部分以及我为调试它所做的工作。

原始代码:

FILE *mplayer_pipe;
char temp[256];

bzero(temp,256);
sprintf(temp,"mplayer -quiet -slave video.mkv > mplayer.log");
mplayer_pipe = popen((char*)temp, "w");

/* watch some values to see what to do next */

/* if I see a value that means I should stop mplayer I do this */

fputs("stop\n",mplayer_pipe);
fflush(mplayer_pipe);
pclose(mplayer_pipe);

我遇到了如果mplayer完成的问题,因此就这样做了 管道的另一端没有任何东西,我仍然在管道上方管道 我的程序崩溃了。为了解决这个问题,我将其更改为以下内容:

FILE *mplayer_pipe;
char temp[256];

bzero(temp,256);
sprintf(temp,"mplayer -quiet -slave video.mkv > mplayer.log");
mplayer_pipe = popen((char*)temp, "w");

/* watch some values to see what to do next */

/* if I see a value that means I should stop mplayer I do this */

FILE *mplayer_status;
int mplayer_pid = 0;
char status_read_char[256];
bzero(status_read_char,256);

mplayer_status = popen("pidof -s mplayer", "r");
fgets(status_read_char, 6, mplayer_status);
pclose(status_read_char);
mplayer_pid = atoi(status_read_char);

if(mplayer_pid > 0) {
fputs("stop\n",mplayer_pipe);
fflush(mplayer_pipe);
pclose(mplayer_pipe);
}
else {
pclose(mplayer_pipe);
}

此修复程序对我来说非常有用,并且它会停止崩溃。

然后我让其他人使用该程序,我开始得到 每隔一段时间就会崩溃。因为我无法得到我的 程序崩溃自己我把它改为以下,看看在哪里 程序崩溃了。

FILE *mplayer_pipe;
char temp[256];

bzero(temp,256);
sprintf(temp,"mplayer -quiet -slave video.mkv > mplayer.log");
mplayer_pipe = popen((char*)temp, "w");
printf("command: mplayer -quiet -slave video.mkv > mplayer.log");

/* watch some values to see what to do next */

/* if I see a value that means I should stop mplayer I do this */

FILE *mplayer_status;
int mplayer_pid = 0;
char status_read_char[256];
bzero(status_read_char,256);

mplayer_status = popen("pidof -s mplayer", "r");
fgets(status_read_char, 6, mplayer_status);
pclose(status_read_char);
mplayer_pid = atoi(status_read_char);
printf("mplayer_status: command: pidof -s mplayer. Got %s, value %d.",status_read_char,mplayer_pid);

if(mplayer_pid > 0) {
fputs("stop\n",mplayer_pipe);
fflush(mplayer_pipe);
printf("command: stop.");
pclose(mplayer_pipe);
}
else {
pclose(mplayer_pipe);
}

在我的节目下次崩溃之前,我得到的最后一件事是:

mplayer_status: command: pidof -s mplayer. Got 27323, value 27323.

对我而言,这表明它在停止时滚动时会发生碰撞 命令mplayer。

有谁知道这里出了什么问题?关于如何做的任何想法 防止它崩溃?

1 个答案:

答案 0 :(得分:1)

不是将停止命令发送到mplayer,为什么不直接发送SIGTERM并关闭管道? mplayer将检测信号并自行停止。

kill(mplayer_pid, SIGTERM);
pclose(mplayer_pipe);

不要忘记在您的计划中加入sys/types.hsignal.h