::: 강좌/소스/문서 :::

강좌/소스/문서 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-17 02:40:57, Hit : 5109, Vote : 1335
 [System V IPC] semop() function - 세마포어

/***************************************************
*   Creat  : 2001. 02. 10  (programed by Cori-Young)
*   Site: http://www.byoneself.co.kr
*   Update :
***************************************************/

#include    <stdio.h>
#include    <sys/types.h>
#include    <sys/ipc.h>
#include    <sys/sem.h>

static int      ask();
extern void     exit();
extern void     free();
extern char     *malloc();
extern void     perror();

static struct semid_ds  semid_ds;            /* status of semaphore set */

static char    error_mesg1[] = "semop: Can't allocate space--1n";
static char   error_mesg2[] = "semop: Can't allocate spaced--2";

main()
{
        register int    i;   /* work area */
        int    nsops;   /* number of operations to do */
        int    semid;   /* semid of semaphore set */
        struct sembuf    *sops;   /* ptr to operations to perform */

        (void) fprintf(stderr, "All numeric input must follow C conventions:n");
        (void) fprintf(stderr, "t0x... is interpreted as hexadecimal,n");
        (void) fprintf(stderr, "t0... is interpreted as octal,n");
        (void) fprintf(stderr, "totherwise, decimal.n");

        /* Loop until the invoker doesn't want to do anymore. */

        while (nsops = ask(&semid, &sops)) {

                  /* Initialize the array of operations to be performed.*/
                  for (i = 0; i < nsops; i++) {

                           (void) fprintf(stderr,"nEnter values for operation %d of %d.n", i + 1, nsops);
                           (void) fprintf(stderr, "sem_num(valid values are 0 <= sem_num < %d): ",semid_ds.sem_nsems);
                           (void) scanf("%hi", &sops[i].sem_num);
                           (void) fprintf(stderr, "sem_op: ");

                           (void) scanf("%hi", &sops[i].sem_op);

                           (void) fprintf(stderr, "Expected flags in sem_flg are:n");
                           (void) fprintf(stderr, "tIPC_NOWAIT =t%#6.6on", IPC_NOWAIT);
                           (void) fprintf(stderr, "tSEM_UNDO =t%#6.6on",   SEM_UNDO);
                           (void) fprintf(stderr, "sem_flg: ");
                           
                           (void) scanf("%hi", &sops[i].sem_flg);

                  }
                
                /* Recap the call to be made. */
                  (void) fprintf(stderr, "nsemop: Calling semop(%d, &sops, %d) with:", semid, nsops);

                  for (i = 0; i < nsops; i++)
                  {
                           (void) fprintf(stderr, "nsops[%d].sem_num = %d, ", i, sops[i].sem_num);
                           (void) fprintf(stderr, "sem_op = %d, ", sops[i].sem_op);
                           (void) fprintf(stderr, "sem_flg = %#on", sops[i].sem_flg);
                  }
                  /* Make the semop() call and report the results. */

                  if ((i = semop(semid, sops, nsops)) == -1) {
                           perror("semop: semop failed");
                  }
                  else {
                           (void) fprintf(stderr, "semop: semop returned %dn", i);
                  }
        }
}

static ask(semidp, sopsp)
int   *semidp;  /* pointer to semid (used only the first time) */
struct sembuf   **sopsp;
{
        static union semun     arg;  /* argument to semctl */
        int     i;  /* work area */
        static int     nsops = 0;  /* size of currently allocated sembuf array */

        static int     semid = -1;   /* semid supplied by user */
        static struct sembuf    *sops;     /* pointer to allocated array */

          if (semid < 0) {

                  /* First call; get semid from user and the current state of  the semaphore set. */
                  (void) fprintf(stderr, "Enter semid of the semaphore set you want to use: ");

                  (void) scanf("%i", &semid);

                  *semidp = semid;
                  arg.buf = &semid_ds;

                  if (semctl(semid, 0, IPC_STAT, arg) == -1)
                  {
                          perror("semop: semctl(IPC_STAT) failed");
                           /* Note that if semctl fails, semid_ds remains filled with zeros, so later test for number of semaphores will be zero. */

                           (void) fprintf(stderr, "Before and after values are not printed.n");
                  }
                  else {
                           if ((arg.array = (ushort *)malloc((unsigned)(sizeof(ushort) * semid_ds.sem_nsems))) == NULL) {
                            (void) fprintf(stderr, error_mesg1, semid_ds.sem_nsems);
                            exit(1);
                        }
                  }
        }
        /* Print current semaphore values. */

        if (semid_ds.sem_nsems) {

                  (void) fprintf(stderr,  "There are %d semaphores in the set.n", semid_ds.sem_nsems);

                  if (semctl(semid, 0, GETALL, arg) == -1) {
                           perror("semop: semctl(GETALL) failed");
                  }
                  else {
                           (void) fprintf(stderr, "Current semaphore values are:");

                           for (i = 0; i < semid_ds.sem_nsems; (void) fprintf(stderr, " %d", arg.array[i++]));
                                   (void) fprintf(stderr, "n");

                  }
        }

        /* Find out how many operations are going to be done in the next  call and allocate enough space to do it. */
        (void) fprintf(stderr,  "How many semaphore operations do you want %sn", "on the next call to semop()?");
        (void) fprintf(stderr, "Enter 0 or control-D to quit: ");

        i = 0;

        if (scanf("%i", &i) == EOF || i == 0)
                  exit(0);

        if (i > nsops) {

                  if (nsops)
                           free((char *)sops);

                  nsops = i;

                  if ((sops = (struct sembuf *)malloc((unsigned)(nsops * sizeof(struct sembuf)))) == NULL) {

                           (void) fprintf(stderr, error_mesg2, nsops);
                           exit(2);
                  }

        }

        *sopsp = sops;

        return (i);
}





  [Unix/Linux] [System V IPC] semop() function - 세마포어  김영대 2003/03/17 5109 1335
22   [Unix/Linux] [Thread] pthread_condattr_destroy() function  김영대 2003/03/17 4572 1333
21   [Unix/Linux] [Thread] pthread_create() function  김영대 2003/03/17 5000 1330
20   [Unix/Linux] [Thread] pthread_getschedparam() function  김영대 2003/03/17 4617 1328
19   [Unix/Linux] [Thread] 읽고/쓰기  김영대 2003/03/17 6172 1320
18   [Unix/Linux] [Thread] pthread_exit() function  김영대 2003/03/17 4589 1313
17   [Unix/Linux] [Thread] pthread_cond_wait() function  김영대 2003/03/17 4752 1309
16   [Unix/Linux] [System V IPC] semctl() function - 세마포어  김영대 2003/03/17 5426 1305
15   [Unix/Linux] [Thread] pthread_setcancelstate() function  김영대 2003/03/17 4780 1298
14   [Unix/Linux] [Thread] pthread_rwlock_init() function  김영대 2003/03/17 5007 1294
13   [Unix/Linux] [소스] top for SunOS 5.x (Solaris 2.x)  김영대 2004/02/20 11292 1237
12   [Unix/Linux] [Thread] pthread_mutex_unlock() function  김영대 2003/03/17 4502 1235
11   [Unix/Linux] [Thread] pthread_cond_destroy() function  김영대 2003/03/17 4591 1233
10   [Unix/Linux] [Thread] pthread_key_delete() function  김영대 2003/03/17 4391 1219
9   [Unix/Linux] [Thread] pthread_setcanceltype() function  김영대 2003/03/17 4469 1215
8   [Unix/Linux] [Thread] pthread_rwlock_init() function  김영대 2003/03/17 4733 1215
7   [Unix/Linux] [Thread] pthread_join() function  김영대 2003/03/17 4759 1213
6   [GRID] [강좌] Globus Toolkit 3.0.2 + SimpleCA 설치  김영대 2003/11/27 6974 1202
5   [Unix/Linux] [소스] top for System V Release 4, Intel or Sparc CPU  김영대 2004/02/20 9583 1199
4   [Unix/Linux] [Thread] pthread_mutexattr_destroy() function  김영대 2003/03/17 4422 1186

[1][2][3][4][5][6][7][8] 9 [10]
 

Copyright 1999-2019 Zeroboard / skin by zero