When I call semctl(), my program crashes. It works fine elsewhere.

The fourth argument to semctl() is a "union semun" that you need to
define yourself. That your programs works on other systems is
sheer luck. The argument passing convention on SPARC/V8 cause your
luck to run out. Instead of passing the contents of small structs
and unions in registers, a copy of the struct/union is made on the
stack and a pointer to that struct is passed.

In short, on SPARC, passing a union containing an integer and just
an integer, both by value, is not the same thing. On other systems
it sometimes is.

Wrong, but it may work on other systems:

semctl(sem_fd, 0, SETVAL, 1);


union semun {
int val;
struct semid_ds *buf;
ushort *array;
} arg;

arg.val = 1;

semctl(sem_fd, 0, SETVAL, arg);

[an error occurred while processing this directive]