📄 gz_client.c
字号:
/* * Gazebo - Outdoor Multi-Robot Simulator * Copyright (C) 2003 * Nate Koenig & Andrew Howard * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * *//* * Desc: Client object * Author: Andrew Howard * Date: 7 May 2003 * CVS: $Id: gz_client.c,v 1.7 2004/10/31 19:25:39 inspectorg Exp $ */#include <assert.h>#include <errno.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include "gz_error.h"#include "gazebo.h"// Local functionsstatic int gz_client_sem_query(gz_client_t *self, int server_id);static int gz_client_sem_init(gz_client_t *self);static int gz_client_sem_fini(gz_client_t *self);static int gz_client_sem_wait(gz_client_t *self);// Create a client objectgz_client_t *gz_client_alloc(){ gz_client_t *self; self = calloc(1, sizeof(gz_client_t)); return self;}// Destroy a clientvoid gz_client_free(gz_client_t *self){ free(self); return;}// Test for the presence of the serverint gz_client_query(gz_client_t *self, int server_id){ return gz_client_sem_query(self, server_id);}// Connect to the serverint gz_client_connect(gz_client_t *self, int server_id){ return gz_client_connect_wait(self, server_id, -1);}// Connect to the serverint gz_client_connect_wait(gz_client_t *self, int server_id, int client_id){ char *tmpdir; char *user; char filename[128]; // Check client id if (client_id >= 0 && client_id >= 16) { GZ_ERROR1("invalid client ID [%d]", client_id); return -1; } self->server_id = server_id; self->client_id = client_id; // Initialize semaphores if (self->client_id >= 0) if (gz_client_sem_init(self) < 0) return -1; // Get the tmp dir tmpdir = getenv("TMP"); if (!tmpdir) tmpdir = "/tmp"; // Get the user user = getenv("USER"); if (!user) user = "nobody"; // Figure out the directory name snprintf(filename, sizeof(filename), "%s/gazebo-%s-%d", tmpdir, user, self->server_id); assert(self->filename == NULL); self->filename = strdup(filename); GZ_MSG1(1, "opening %s", self->filename); return 0;}// Disconnect from the serverint gz_client_disconnect(gz_client_t *self){ GZ_MSG1(1, "closing %s", self->filename); assert(self->filename != NULL); free(self->filename); // Finalize semaphores if (self->client_id >= 0) if (gz_client_sem_fini(self) < 0) return -1; return 0;}// Wait for new data to be posted (blocking)int gz_client_wait(gz_client_t *self){ if (self->client_id >= 0) return gz_client_sem_wait(self); return 0;}// Initialize semaphoresint gz_client_sem_query(gz_client_t *self, int server_id){ int sem_key; sem_key = GZ_SEM_KEY + server_id; // Try to get the semaphore if (semget(sem_key, 0, S_IRWXU) < 0) { // No semaphore, so no server if (errno == ENOENT) return 1; // Ooops, some kind of error GZ_ERROR1("failed to query semaphore [%s]", strerror(errno)); return -1; } // We have a server return 0;}// Initialize semaphoresint gz_client_sem_init(gz_client_t *self){ self->sem_key = GZ_SEM_KEY + self->server_id; // Get the client semaphore group self->sem_cid = semget(self->sem_key, 0, S_IRWXU); if (self->sem_cid < 0) { GZ_ERROR1("Failed to allocate semaphore [%s]", strerror(errno)); GZ_ERROR("The server does not appear to be running"); return -1; } return 0;}// Finalize semaphoresint gz_client_sem_fini(gz_client_t *self){ return 0;}// Wait for new data to be posted (blocking)int gz_client_sem_wait(gz_client_t *self){ struct sembuf operations[1]; operations[0].sem_num = self->client_id; operations[0].sem_op = -1; operations[0].sem_flg = SEM_UNDO; if (semop(self->sem_cid, operations, 1) < 0) { GZ_ERROR1("error on semaphore wait [%s]", strerror(errno)); return -1; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -