首页 > 代码库 > open files
open files
/* * * Copyright (c) International Business Machines Corp., 2001 * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *//* * FILE : openfile.c * DESCRIPTION : Create files and open simultaneously * HISTORY: * 03/21/2001 Paul Larson (plars@us.ibm.com) * -Ported * 11/01/2001 Mnaoj Iyer (manjo@austin.ibm.com) * - Modified. * added #inclide <unistd.h> * */#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <stdint.h>#include <unistd.h>#include "test.h"#include "usctest.h"char *TCID = "openfile01"; /* Test program identifier. */int TST_TOTAL = 1;#define MAXFILES 32768#define MAXTHREADS 10/* Control Structure */struct cb { pthread_mutex_t m; pthread_cond_t init_cv; pthread_cond_t thr_cv; int thr_sleeping;} c;/* Global Variables */int numthreads = 10, numfiles = 10;int debug = 0;char *filename = "FILETOOPEN";void setup(void){ tst_tmpdir();}void cleanup(void){ tst_rmdir();}/* Procedures */void *threads(void *thread_id);/* ************************************************************************** * MAIN PROCEDURE * ************************************************************************** */int main(int argc, char *argv[]){ int i, opt, badopts = 0; FILE *fd; pthread_t th_id; char msg[80] = ""; extern char *optarg; while ((opt = getopt(argc, argv, "df:t:h")) != EOF) { switch ((char)opt) { case ‘d‘: debug = 1; break; case ‘f‘: numfiles = atoi(optarg); if (numfiles <= 0) badopts = 1; break; case ‘t‘: numthreads = atoi(optarg); if (numthreads <= 0) badopts = 1; break; case ‘h‘: default: printf("Usage: openfile [-d] -f FILES -t THREADS\n"); _exit(1); } } if (badopts) { printf("Usage: openfile [-d] -f FILES -t THREADS\n"); _exit(1); } setup(); /* Check if numthreads is less than MAXFILES */ if (numfiles > MAXFILES) { sprintf(msg, "%s\nCannot use %d files", msg, numfiles); sprintf(msg, "%s, used %d files instead\n", msg, MAXFILES); numfiles = MAXFILES; } /* Check if numthreads is less than MAXTHREADS */ if (numthreads > MAXTHREADS) { sprintf(msg, "%s\nCannot use %d threads", msg, numthreads); sprintf(msg, "%s, used %d threads instead\n", msg, MAXTHREADS); numthreads = MAXTHREADS; } /* Create files */ if ((fd = fopen(filename, "w")) == NULL) { tst_resm(TFAIL, "Could not create file"); cleanup(); } /* Initialize thread control variables, lock & condition */ pthread_mutex_init(&c.m, NULL); pthread_cond_init(&c.init_cv, NULL); pthread_cond_init(&c.thr_cv, NULL); c.thr_sleeping = 0; /* Grab mutex lock */ if (pthread_mutex_lock(&c.m)) { tst_resm(TFAIL, "failed to grab mutex lock"); fclose(fd); unlink(filename); cleanup(); } printf("Creating Reading Threads\n"); /* Create threads */ for (i = 0; i < numthreads; i++) if (pthread_create(&th_id, (pthread_attr_t *) NULL, threads, (void *)(uintptr_t) i)) { tst_resm(TFAIL, "failed creating a pthread; increase limits"); fclose(fd); unlink(filename); cleanup(); } /* Sleep until all threads are created */ while (c.thr_sleeping != numthreads) if (pthread_cond_wait(&c.init_cv, &c.m)) { tst_resm(TFAIL, "error while waiting for reading threads"); fclose(fd); unlink(filename); cleanup(); } /* Wake up all threads */ if (pthread_cond_broadcast(&c.thr_cv)) { tst_resm(TFAIL, "failed trying to wake up reading threads"); fclose(fd); unlink(filename); cleanup(); } /* Release mutex lock */ if (pthread_mutex_unlock(&c.m)) { tst_resm(TFAIL, "failed to release mutex lock"); fclose(fd); unlink(filename); cleanup(); } tst_resm(TPASS, "Threads are done reading"); fclose(fd); unlink(filename); cleanup(); _exit(0);}/* ************************************************************************** * OTHER PROCEDURES * ************************************************************************** */void close_files(FILE * fd_list[], int len){ int i; for (i = 0; i < len; i++) { fclose(fd_list[i]); }}/* threads: Each thread opens the files specified */void *threads(void *thread_id_){ int thread_id = (uintptr_t) thread_id_; char errmsg[80]; FILE *fd_list[MAXFILES]; int i; /* Open files */ for (i = 0; i < numfiles; i++) { if (debug) printf("Thread %d : Opening file number %d \n", thread_id, i); if ((fd_list[i] = fopen(filename, "rw")) == NULL) { sprintf(errmsg, "FAIL - Couldn‘t open file #%d", i); perror(errmsg); if (i > 0) { close_files(fd_list, i - 1); } unlink(filename); pthread_exit((void *)1); } } /* Grab mutex lock */ if (pthread_mutex_lock(&c.m)) { perror("FAIL - failed to grab mutex lock"); close_files(fd_list, numfiles); unlink(filename); pthread_exit((void *)1); } /* Check if you should wake up main thread */ if (++c.thr_sleeping == numthreads) if (pthread_cond_signal(&c.init_cv)) { perror("FAIL - failed to signal main thread"); close_files(fd_list, numfiles); unlink(filename); pthread_exit((void *)1); } /* Sleep until woken up */ if (pthread_cond_wait(&c.thr_cv, &c.m)) { perror("FAIL - failed to wake up correctly"); close_files(fd_list, numfiles); unlink(filename); pthread_exit((void *)1); } /* Release mutex lock */ if (pthread_mutex_unlock(&c.m)) { perror("FAIL - failed to release mutex lock"); close_files(fd_list, numfiles); unlink(filename); pthread_exit((void *)1); } /* Close file handles and exit */ close_files(fd_list, numfiles); unlink(filename); pthread_exit((void *)0);}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。