6.22) 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);

Right:

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

arg.val = 1;

semctl(sem_fd, 0, SETVAL, arg);

PREV INDEX NEXT