1. 将互斥机制的代码实现重新敲一遍
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>#define MAXSIZE 128int num = 520;
pthread_mutex_t mutex;void* task1(void* arg)
{printf("111111111111111\n");pthread_mutex_lock(&mutex);num = 1314;sleep(3);printf("task1:num = %d\n", num);pthread_mutex_unlock(&mutex);
}void* task2(void* arg)
{printf("222222222222222\n");pthread_mutex_lock(&mutex);num++;sleep(1);printf("task2:num = %d\n", num);pthread_mutex_unlock(&mutex);
}int main(int argc, char const *argv[])
{pthread_mutex_init(&mutex, NULL);pthread_t thread1, thread2;if (pthread_create(&thread1, NULL, task1, NULL) != 0 || \pthread_create(&thread2, NULL, task2, NULL) != 0){perror("thread create error");return -1;}printf("thread1:%#lx, thread2:%#lx\n", thread1, thread2);pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_mutex_destroy(&mutex);return 0;
}
2. 将无名信号量的代码实现重新敲一遍
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>#define MAXSIZE 1024sem_t sem1;
sem_t sem2;
sem_t sem3;void* task1(void* arg)
{int num = 5;while (num--){sem_wait(&sem1);printf("A");sem_post(&sem2);}pthread_exit(NULL);
}void* task2(void* arg)
{int num = 5;while (num--){sem_wait(&sem2);printf("B");sem_post(&sem3);}pthread_exit(NULL);
}void* task3(void* arg)
{int num = 5;while (num--){sem_wait(&sem3);printf("C\n");sem_post(&sem1);}pthread_exit(NULL);
}int main(int argc, char const *argv[])
{sem_init(&sem1, 0, 1);sem_init(&sem2, 0, 0);sem_init(&sem3, 0, 0);pthread_t thread1, thread2, thread3;if (pthread_create(&thread1, NULL, task1, NULL) != 0 || \pthread_create(&thread2, NULL, task2, NULL) != 0 || \pthread_create(&thread3, NULL, task3, NULL) != 0){puts("thread create error");return -1;}pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_join(thread3, NULL);sem_destroy(&sem1);sem_destroy(&sem2);sem_destroy(&sem3);return 0;
}
3. 将条件变量的代码实现重新敲一遍
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>#define MAXSIZE 128pthread_cond_t cond;
pthread_mutex_t mutex;void* task1(void* arg)
{int num = 5;while (num--){sleep(1);printf("%#lx:生产一辆车\n", pthread_self());}pthread_cond_broadcast(&cond);pthread_exit(NULL);
}void* task2(void* arg)
{pthread_mutex_lock(&mutex);pthread_cond_wait(&cond, &mutex);printf("%#lx:获得一辆车\n", pthread_self());pthread_mutex_unlock(&mutex);
}int main(int argc, char const *argv[])
{pthread_mutex_init(&mutex, NULL);pthread_t thread1, thread2, thread3, thread4, thread5, thread6;if (pthread_create(&thread1, NULL, task1, NULL) != 0 || \pthread_create(&thread2, NULL, task2, NULL) != 0 || \pthread_create(&thread3, NULL, task2, NULL) != 0 || \pthread_create(&thread4, NULL, task2, NULL) != 0 || \pthread_create(&thread5, NULL, task2, NULL) != 0 || \pthread_create(&thread6, NULL, task2, NULL) != 0){perror("thread create error");return -1;}printf("thread1:%#lx, thread2:%#lx, thread3:%#lx, thread4:%#lx, thread5:%#lx, thread6:%#lx\n", thread1, thread2, thread3, thread4, thread5, thread6);pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_join(thread3, NULL);pthread_join(thread4, NULL);pthread_join(thread5, NULL);pthread_join(thread6, NULL);pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);return 0;
}
4. 将无名管道的代码实现重新敲一遍
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>#define MAXSIZE 1024int main(int argc, char const *argv[])
{int pipefd[2] = { 0 };if (pipe(pipefd) == -1){perror("pipe error");return -1;} printf("pipefd[0]=%d, pipefd[1]=%d\n", pipefd[0], pipefd[1]);pid_t pid = fork();if (pid > 0){close(pipefd[0]);char wbuf[128] = "";while (1){bzero(wbuf, sizeof(wbuf));fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf) - 1] = 0;write(pipefd[1], wbuf, strlen(wbuf));if (strcmp(wbuf, "quit") == 0){break;}}close(pipefd[1]);wait(NULL);}else if (pid == 0){close(pipefd[1]);char rbuf[128] = "";while (1){bzero(rbuf, sizeof(rbuf));read(pipefd[0], rbuf, sizeof(rbuf));printf("父进程传入的字符串是:%s\n", rbuf);if (strcmp(rbuf, "quit") == 0){break;}}close(pipefd[0]);exit(EXIT_SUCCESS);}return 0;
}
5. 将有名管道的代码实现重新敲一遍
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>#define MAXSIZE 128void menu()
{printf("请选择:\n");printf("1.创建管道\n");printf("2.输入\n");printf("3.输出\n");printf("4.删除管道\n");printf("选择:");
}int init_fifo(char* filename)
{if (mkfifo(filename, 0664) == -1){return -1;}return 0;
}void* send(void* arg)
{char* filename = (char*)arg;int wfd = -1;if ((wfd = open(filename, O_WRONLY)) == -1){perror("open error");exit(EXIT_FAILURE);}char wbuf[MAXSIZE] = "";while (1){printf("输入>>>");fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf) - 1] = 0;write(wfd, wbuf, strlen(wbuf));if (strcmp(wbuf, "quit") == 0){break;}}close(wfd);exit(EXIT_SUCCESS);
}void* receive(void* arg)
{int rfd = -1;if ((rfd = open("./myfifo", O_RDONLY)) == -1){perror("open error");exit(EXIT_FAILURE);}char rbuf[MAXSIZE] = "";while (1){bzero(rbuf, sizeof(rbuf));read(rfd, rbuf, sizeof(rbuf));printf("收到的数据为:%s\n", rbuf);if (strcmp(rbuf, "quit") == 0){break;}}close(rfd);exit(EXIT_SUCCESS);
}int main(int argc, char const *argv[])
{int n;menu();scanf("%d", &n);getchar();char filename[] = "./myfifo";if (n == 1){if (init_fifo(filename) == 0){puts("创建成功!");}else{puts("创建失败!");}return 0;}if (n == 4){char cmd[MAXSIZE];snprintf(cmd, sizeof(cmd), "rm %s", filename);system(cmd);return 0;}pthread_t thread = -1;if (n == 2){if (pthread_create(&thread, NULL, send, filename) != 0){perror("create thread error");return -1;}}if (n == 3){if (pthread_create(&thread, NULL, receive, filename) != 0){perror("create thread error");return -1;}}pthread_join(thread, NULL);return 0;
}
6. 使用有名管道完成两个进程的相互通信(可使用多进程或多线程)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>#define MAXSIZE 128void menu()
{printf("请选择:\n");printf("1.创建管道\n");printf("2.输入输出\n");printf("3.输出输入\n");printf("4.删除管道\n");printf("选择:");
}int init_fifo(char* filename)
{if (mkfifo(filename, 0664) == -1){return -1;}return 0;
}void* send(void* arg)
{char* filename = (char*)arg;int wfd = -1;if ((wfd = open(filename, O_WRONLY)) == -1){perror("open error");exit(EXIT_FAILURE);}char wbuf[MAXSIZE] = "";while (1){fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf) - 1] = 0;write(wfd, wbuf, strlen(wbuf));if (strcmp(wbuf, "quit") == 0){break;}}close(wfd);exit(EXIT_SUCCESS);
}void* receive(void* arg)
{char* filename = (char*)arg;int rfd = -1;if ((rfd = open(filename, O_RDONLY)) == -1){perror("open error");exit(EXIT_FAILURE);}char rbuf[MAXSIZE] = "";while (1){bzero(rbuf, sizeof(rbuf));read(rfd, rbuf, sizeof(rbuf));printf("收到的数据为:%s\n", rbuf);if (strcmp(rbuf, "quit") == 0){break;}}close(rfd);exit(EXIT_SUCCESS);
}int main(int argc, char const *argv[])
{int n;menu();scanf("%d", &n);getchar();char f1[] = "./myfifo0";char f2[] = "./myfifo1";if (n == 1){if (init_fifo(f1) == 0 && init_fifo(f2) == 0){puts("创建成功!");}else{puts("创建失败!");}return 0;}if (n == 4){char cmd[MAXSIZE];snprintf(cmd, sizeof(cmd), "rm %s %s", f1, f2);system(cmd);return 0;}pthread_t thread1 = -1;pthread_t thread2 = -1;if (n == 2){if (pthread_create(&thread1, NULL, send, f1) != 0){perror("create thread error");return -1;}if (pthread_create(&thread2, NULL, receive, f2) != 0){perror("create thread error");return -1;}}if (n == 3){if (pthread_create(&thread1, NULL, send, f2) != 0){perror("create thread error");return -1;}if (pthread_create(&thread2, NULL, receive, f1) != 0){perror("create thread error");return -1;}}pthread_join(thread1, NULL);pthread_join(thread2, NULL);return 0;
}