gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:22:08 26 4
gpt4 key购买 nike

我有一个用 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 的命令。

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

最佳答案

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

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

不要忘记在程序中包含 sys/types.hsignal.h

关于c - 通过管道向 mplayer 发送数据时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18166688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com