pipe와 fork를 사용한 프로그램..
글쓴이: itoti / 작성시간: 목, 2003/10/23 - 1:29오전
void Player::Play(const char *mp3name)
{
if (state == PAUSED && mp3name && Player::mp3name && \
!strcmp(mp3name,Player::mp3name))
Pause();
else
if (mp3name) {
if (state != STOPPED) Stop();
if(Player::mp3name) delete[] mp3name;
Player::mp3name = strdup(mp3name);
int pipes[2];
int fork_res;
if (pipe(pipes) == 0) {
fork_res = fork();
if (fork_res == -1) {
cerr << "Can't fork !!\n";
exit(1);
}
if (fork_res == 0) {
if (close(2)) cerr << "Can't close stderr\n";
dup2(pipes[1],2);
close(pipes[0]);
close(pipes[1]);
char *str = new char[128];
sprintf(str,"%d",buffersize);
execlp(playercommand,playercommand,"",mp3name,(char *)0);
cerr << "Can't execlp " << playercommand << "\n";
exit(1);
} else {
close(pipes[1]);
char *buf = new char[2048+1];
char *p; char c;
int failed = 0;
for (int i = 0; i< 8; i++)
{
c='\0';
p=buf;
while (c != '\n')
{
read(pipes[0],&c,1); *p++ = c;
}
*p = '\0';
if(i==3 && *buf != '\n') {failed =1; i=8;}
if(i==5 && *buf == 'I') {failed =1; i=8;}
}
delete[] buf;
close(pipes[0]);
sleep(1);
playerpid = fork_res;
state = PLAYING;
emit Playing();
if (failed) Stop();
}
}
}
}
프로세서를 이용하여 mp3플레이 하는 소스의 일 부분인데요..
여기서 플레이가 안되고 멈추게 되는 데요..
pipe가 생성이 안되는 것 같은데.. 그이유는 무엇인가요??
플레이를 하면 세그멘테이션 오류가 뜨거나 그냥 멈춰 버립니다...
혹시 이유를 아시거나..
주석을 좀 달아 주시겠어요..
프로세서 관련 코드를 처음 접해봐서.. 너무 어렵네요...
감사합니다.
Forums:


댓글 달기