博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
open files
阅读量:6996 次
发布时间:2019-06-27

本文共 5998 字,大约阅读时间需要 19 分钟。

/* * *   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 
* */#include
#include
#include
#include
#include
#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);}

 

转载于:https://www.cnblogs.com/unixshell/p/3818759.html

你可能感兴趣的文章