Issue with SDL + arm CPU + popen() hanging

Hi everyone,

I have been using SDL for a couple of years now, both for development
under Linux on X86 and production on a Linux based arm RISC cpu (Arcom
Viper PXA255 based single board computer).

Yesterday I happened upon a problem whereby my app would hang. I traced
it to the particular combination of running SDL, on the arm CPU, and
calling the system call popen(). Other combinations such as no-SDL +
arm + popen() or SDL + x86 + popen() worked fine.

Normally when the app is running on the arm machine, the process is
visible thus (using ps-ef, process is called ‘t’):

377 root 1204 S /mnt/eas/src/eas/t
381 root 1204 S /mnt/eas/src/eas/t
382 root 1204 S /mnt/eas/src/eas/t

However when the app calls popen(), the result is as follows:

377 root 1236 D /mnt/eas/src/eas/t
381 root Z [t]
394 root 1236 S /mnt/eas/src/eas/t

The process is locked up and I have to kill -9 to get it back.

I was running SDL 1.2.7 but have upgraded to 1.2.9 and am experiencing
the same problem. I also looked through the SDL archives, Googled etc.
but to no avail.

To narrow it down I have produced a simple test program that exhibits
the fault. Maybe someone has an idea of what’s wrong. I suspect my
code is probably OK, though if it’s just my code at fault I’ll be very
happy! I’ll list it below as it’s quite short.

As I say, it’s just when running SDL on the Viper, and then calling popen().

#include <stdio.h>
#include <SDL.h> /* All SDL App’s need this */

/* Compile with:

arm-linux-gcc -o t t.c -I /usr/local/include/SDL
-L/home/martin/src/sdl/viper/lib -lSDL
*/

SDL_Surface *display_init(void)
{
SDL_Surface *s;

if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER)==-1))
{
fprintf(stderr, “Could not initialize SDL: %s.\n”,
SDL_GetError());

return NULL;

}

/* Clean up on exit */

atexit(SDL_Quit);

/* Request a video mode */

if ((s = SDL_SetVideoMode(640, 480, 8, 0)) == NULL)
{
fprintf(stderr, “Couldn’t set video mode: %s\n”, SDL_GetError());

return NULL;

}

return s;
}

int main()
{
SDL_Surface *screen;
FILE *fp;
char *command = “uptime”;

if ((screen = display_init()) == NULL)
return -1;

sleep (10);

printf(“About to call popen() and hence lock up…\n”);

if ((fp = popen(command, “r”)) == NULL)
{
fprintf(stderr, “Problem calling popen()!\n”);

return -1;

}

printf(“Oh, popen() returned!\n”);

pclose(fp);

return 0;
}–
R A Ward Ltd.
Christchurch, New Zealand