一、请使用消息队列实现2个终端之间互相聊天
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>void task_w()
{if(access("fifo1", F_OK)==-1){mkfifo("./fifo1", 0666);}int fd=open("./fifo1",O_WRONLY | O_TRUNC);while(1){char buf[128]={0};printf("请输入:");scanf("%s", buf);while(getchar()!=10);write(fd, buf, strlen(buf));}close(fd);
}void task_r()
{if(access("fifo2", F_OK)==-1){mkfifo("./fifo2", 0666);}int fd=open("./fifo2", O_RDONLY);while(1){char buf[128]={0};int res=read(fd, buf, 128);if(res==0){break;}printf("\b\b\b\b\b\b\b读取到的消息为:%s\n", buf);printf("请输入:");fflush(stdout);}close(fd);
}void handler(int signum)
{if(signum==SIGPIPE){printf("管道破裂\n");exit(0);}
}void* thread_main(void* arg)
{task_r();
}int main()
{signal(SIGPIPE, handler);pthread_t id;pthread_create(&id, 0, thread_main, 0);pthread_detach(id);task_w();return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>void task_w()
{if(access("fifo2", F_OK)==-1){mkfifo("./fifo2", 0666);}int fd=open("./fifo2",O_WRONLY | O_TRUNC);while(1){char buf[128]={0};printf("请输入:");scanf("%s", buf);while(getchar()!=10);write(fd, buf, strlen(buf));}close(fd);
}void task_r()
{if(access("fifo1", F_OK)==-1){mkfifo("./fifo1", 0666);}int fd=open("./fifo1", O_RDONLY);while(1){char buf[128]={0};int res=read(fd, buf, 128);if(res==0){break;}printf("\b\b\b\b\b\b\b读取到的消息为:%s\n", buf);printf("请输入:");fflush(stdout);}close(fd);
}void handler(int signum)
{if(signum==SIGPIPE){printf("管道破裂\n");exit(0);}
}void* thread_main(void* arg)
{task_r();
}int main()
{signal(SIGPIPE, handler);pthread_t id;pthread_create(&id, 0, thread_main, 0);pthread_detach(id);task_w();return 0;
}
二、请使用共享内存+信号灯集,实现2个进程之间互相聊天
三、请实现一个终端的功能,注意需要带有cd功能
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>char *mygets(char *s, int size)
{char *res = fgets(s, size, stdin);int len = strlen(s);if (s[len-1] == '\n'){s[len-1] = '\0';}return s;
}int main(int argc, const char *argv[])
{while(1){pid_t pid = fork();if(pid > 0){wait(0);}else if(pid == 0){char *username = getlogin(); //获取用户名char hostname[64] = {0};gethostname(hostname, 63); //获取主机名char cwd[64] = "";getcwd(cwd, 63); //获取当前工作路径//\033[ 显示方式 ; 前景色 ; 背景色mprintf("\033[1;32;10m%s@%s\033[0m:\033[1;34;10m%s\033[0m$ ", username, hostname, cwd);fflush(stdout);char shell[256] = {0};char *cmd[100] = {0};mygets(shell, 256);char *res = NULL;int i = 0;while(1){if(res == NULL){res = strtok(shell, " ");}else{res = strtok(NULL, " ");}if(res == NULL){break;}cmd[i] = res;i++;}char pathname[32] = "/bin/";strcat(pathname, cmd[0]);execvp(cmd[0], cmd);printf("%s:未找到命令\n", cmd[0]);}}return 0;
}
四、请使用dup2+fgets+printf实现文件拷贝功能
五、请使用read和write实现链表保存到文件,以及从文件加载数据到链表中的功能
六、请使用互斥锁和信号量分别实现5个线程之间的同步
七、请使用条件变量实现2生产者2消费者模型,注意1个生产者在生产的时候,另外一个生产者不能生产
八、请写一个双向链表的快速排序函数
九、请用递归实现计算:1+1/3-1/5+1/7-1/9+...1/n 的值,n通过键盘输入
十、请写出以下几个数据的类型
// 整数a:类型:int// a的地址:类型:int *// 存放a的数组b:类型:int[]// 存放a的地址的数组c:类型:int* []// b的地址:类型:int (*)[]// c的地址:类型:int**// 指向printf函数的指针d:类型:int (*)(const char*, ...)// 存放d的数组:类型:int (**)[]