Ich gebe dir mal ein ausschnitt aus mein "mpg123" wrapper. Der funktioniert inklusive stderr, stdin, stdout.
if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd_send) < 0)
return ;
if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd_recv) < 0)
return ;
if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd_err) < 0)
return ;
// handle signals
signal(SIGPIPE, childhandler);
signal(SIGCHLD, childhandler);
childpid = fork();
if (childpid == 0) {
// pipe in/output through socket to parent
dup2(fd_send[0], STDIN_FILENO);
close(fd_send[0]);
close(fd_send[1]);
dup2(fd_recv[0], STDOUT_FILENO);
close(fd_recv[0]);
close(fd_recv[1]);
dup2(fd_err[0], STDERR_FILENO);
close(fd_err[0]);
close(fd_err[1]);
// spawn player
execvp(prg[0],prg);
// never reached if exec was ok
debug("0 <%s> 1 <%s>\n",prg[0],prg[1]);
debug("mpg123 didn't start execvp failed %d (%s)\n",errno,strerror(errno));
exit(-1);
}
close(fd_send[0]);
childstdin = fd_send[1];
close(fd_recv[0]);
childstdout = fd_recv[1];
close(fd_err[0]);
childstderr = fd_err[1];
// check if player is running
sleep(1);
if (!childpid) {
fprintf(stderr, "mod_mpg123_start(): player process didn't start!\n");
Display More