shj
作者:
丿灬卿欢
,
2023-12-08 16:45:03
,
所有人可见
,
阅读 83
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#define N 5
#define M 8
unsigned int ns = 0;
sem_t sem;
sem_t wfm;
sem_t wfs;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *Student(void *i) {
long id = (long)i;
printf("Student %ld is entering...\n", id);
sem_wait(&sem);
pthread_mutex_lock(&mutex);
ns++;
if (ns == 1) {
sem_wait(&wfm);
printf("The 1st student entered.\n");
}
pthread_mutex_unlock(&mutex);
printf("Student %ld has been entered.\n", id);
int time = rand() % 10 + 1;
sleep(time);
printf("Student %ld is going to leave...\n", id);
pthread_mutex_lock(&mutex);
ns--;
printf("Student %ld has left.\n", id);
if (ns == 0) {
sem_post(&wfs);
printf("The last student left.\n");
}
pthread_mutex_unlock(&mutex);
sem_post(&sem);
pthread_exit(NULL);
}
void *Manager() {
printf("Manager open door.\n");
sem_post(&wfm);
printf("Manager is waiting for all students to leave.\n");
sem_wait(&wfs);
printf("Manager close door.\n");
pthread_exit(NULL);
}
int main() {
sem_init(&sem, 0, N);
sem_init(&wfm, 0, 1);
sem_init(&wfs, 0, 0);
pthread_t students[M];
for (long i = 0; i < M; i++) {
pthread_create(&students[i], NULL, Student, (void *)i);
}
pthread_t manager;
pthread_create(&manager, NULL, Manager, NULL);
for (long i = 0; i < M; i++) {
pthread_join(students[i], NULL);
}
pthread_join(manager, NULL);
sem_destroy(&sem);
sem_destroy(&wfm);
sem_destroy(&wfs);
return 0;
}
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#define MAXLINE 20 // 管道容纳字节数
int main(int argc, char* argv[]) {
int in = atoi(argv[1]); // 命令行输入整数
int com[2]; // command管道
int res[2]; // response管道
pid_t pid;
if (pipe(com) < 0 || pipe(res) < 0) { perror("pipe error"); exit(EXIT_FAILURE); } if ((pid = fork()) < 0) { perror("fork error"); exit(EXIT_FAILURE); } if (pid > 0) { // 父进程为Client close(com[0]); // 关闭com的读端口 close(res[1]); // 关闭res的写端口 for (int i = 1; i < 4; i++) { write(com[1], &in, sizeof(int)); // 把输入送给Server read(res[0], &in, sizeof(int)); // 等待Server处理完毕返回结果 // 在这里可以进行进一步的操作,但这里没具体展示 } printf("result is %i\n", in); kill(pid, SIGKILL); // 终止子进程,即Server进程 waitpid(pid, NULL, 0); // 回收子进程 exit(EXIT_SUCCESS); } else { // 子进程为Server close(com[1]); // 关闭com的写端口 close(res[0]); // 关闭res的读端口 while (1) { if (read(com[0], &in, sizeof(int)) <= 0) // Server从com读出输入 break; // 当管道关闭时退出循环 in = in * in; // 进行平方运算 write(res[1], &in, sizeof(int)); // 将结果写入res } exit(EXIT_SUCCESS); }
}