/* * Copyright (C) 1999,2001,2010 by Manfred Spraul. * * Redistribution of this file is permitted under the terms of the GNU * General Public License (GPL) * $Header: /home/manfred/cvs-tree/manfred/ipcsem/undotest.c,v 1.2 2003/06/28 15:19:43 manfred Exp $ */ #include #include #include #include #include #include #include #include #include #include #include #include #include union semun { int val; struct semid_ds *buf; unsigned short int *array; struct seminfo* __buf; }; int getval(char *str, int id) { union semun arg; int res; res = semctl(id,0,GETVAL,arg); if(res==-1) { printf("GETVAL failed for %s.\n", str); exit(4); } printf(" %s: GETVAL now %d.\n",str, res); return res; } void setval(int id, int val) { union semun arg; int res; arg.val = val; res = semctl(id,0,SETVAL,arg); if(res==-1) { printf("SETVAL failed, errno %d.\n", errno); exit(4); } printf(" SETVAL succeeded.\n"); } long int print_ctime(char *str, int id) { union semun arg; struct semid_ds info; time_t cur = time(NULL); int res; arg.buf = &info; res = semctl(id,0,IPC_STAT,arg); if(res==-1) { printf("semctl(IPC_STAT) failed (%d).\n",errno); exit(5); } printf("%s: ctime now %ld (%ld).\n", str, (long int) info.sem_ctime, (long int) cur - info.sem_ctime); return info.sem_ctime; } #define CHILD_COUNT 5 #define EXIT_SUCCESS_MAGIC 0x42 /* test1: check cpu consumption for complex sleeps */ void test1() { int childs[CHILD_COUNT]; unsigned long long total_sys, total_user; int res; int i; int id; printf(" ****************************************\n"); printf(" test1: do a non-trivial sleep\n"); /* create array */ res = semget(IPC_PRIVATE, 1, 0700 | IPC_CREAT); printf(" got semaphore array %xh.\n",res); if(res == -1) { printf(" create failed.\n"); return; } id = res; setval(id, 3); /* create sub-process */ for (i=0;i