为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 100
学习任务

qq_康斯坦丁_0 的学生作业:

#include #include #include #include #include #include #define TIMEOUT_SECONDS 3 #define MAX_TIMEOUT_COUNT 3 volatile int timeout_flag = 0; int timeout_count = 0; void timeout_handler(int signo) { timeout_flag = 1; } int main() { char buffer[256]; struct sigaction sa; fd_set readfds; struct timeval tv; int ret; // 设置SIGALRM信号处理函数 sa.sa_handler = timeout_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGALRM, &sa, NULL) < 0) { perror("设置信号处理函数失败"); exit(1); } printf("请输入内容(在%d秒内):\n", TIMEOUT_SECONDS); while (timeout_count < MAX_TIMEOUT_COUNT) { FD_ZERO(&readfds); FD_SET(STDIN_FILENO, &readfds); // 设置超时时间 tv.tv_sec = TIMEOUT_SECONDS; tv.tv_usec = 0; // 重置超时标志 timeout_flag = 0; // 设置定时器 alarm(TIMEOUT_SECONDS); // 等待输入或超时 ret = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &tv); // 取消定时器 alarm(0); if (ret < 0) { perror("select错误"); exit(1); } else if (ret == 0 || timeout_flag) { // 超时 timeout_count++; printf("输入超时!(第%d次)\n", timeout_count); if (timeout_count < MAX_TIMEOUT_COUNT) { printf("请再次输入(在%d秒内):\n", TIMEOUT_SECONDS); } } else { // 有输入 if (fgets(buffer, sizeof(buffer), stdin) != NULL) { printf("您输入的内容是:%s", buffer); timeout_count = 0; // 重置超时计数 printf("请继续输入(在%d秒内):\n", TIMEOUT_SECONDS); } } } printf("已连续超时%d次,程序退出!\n", MAX_TIMEOUT_COUNT); return 0; }

得分 100
学习任务

史啦啦 的学生作业:

#include #include #include #include #include /* See NOTES */ #include #include #include #include #include #include #define LOGIN_SUCCESS 1 #define LOGIN_FAILURE 0 typedef struct { char *ip; unsigned char flag; struct sockaddr_in *peer_addr; }thread_type; void printf_client_info(struct sockaddr_in *addr,char *buf) { printf("===============================\n"); printf("user IP : %s\n",inet_ntoa(addr->sin_addr)); printf("user port : %d\n", ntohs(addr->sin_port)); printf("user data : %s\n",buf); } //1.初始化socket连接 int init_socket(const char *ip,const char *port) { int sockfd = 0; struct sockaddr_in my_addr; socklen_t len = sizeof(my_addr); //1.通过socket创建文件描述符 sockfd = socket(AF_INET,SOCK_DGRAM ,0); if(sockfd < 0) { perror("Fail to socket!"); exit(EXIT_FAILURE); } //2.填充服务器自己的ip地址和port,然后绑定 memset(&my_addr,0,sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(atoi(port)); my_addr.sin_addr.s_addr = inet_addr(ip); if(bind(sockfd,(struct sockaddr *)&my_addr,len) < 0) { perror("Fail to bind"); return -1; } return sockfd; } void recv_data(int new_sockfd) { int n = 0; char buf[1024] = {0}; struct sockaddr_in client_addr; socklen_t len = sizeof(client_addr); //3.发送数据 while(1) { memset(buf,0,sizeof(buf)); n = recvfrom(new_sockfd,buf,sizeof(buf),0,(struct sockaddr *)&client_addr,&len); if(n < 0) { perror("Fail to recvfrom"); exit(EXIT_FAILURE); } printf_client_info(&client_addr,buf); if(strncmp(buf,"quit",4) == 0) break; } close(new_sockfd); return ; } void *message_thread(void *arg) { thread_type *packet = (thread_type *)arg; //1.给用户回复的秘钥正确信息 char *ip = packet->ip; unsigned char login_flag = packet->flag; struct sockaddr_in *addr = packet->peer_addr; //创建套接字,获得用户数据,绑定0号端口,系统会随机分配一个可用的端口 int new_sockfd = init_socket(ip,"0"); sendto(new_sockfd,&login_flag,sizeof(login_flag),0,(struct sockaddr *)addr,sizeof(struct sockaddr_in)); //接收数据 recv_data(new_sockfd); pthread_exit(NULL); } void user_login(const char *ip,const char *port) { int n = 0; char buf[1024] = {0}; struct sockaddr_in client_addr; socklen_t len = sizeof(client_addr); unsigned char login_flag; int sockfd; thread_type packet; pthread_t tid; //1.创建套接字,获得用户数据 sockfd = init_socket(ip,port); //2.接收登录数据 while(1) { memset(buf,0,sizeof(buf)); n = recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&client_addr,&len); if(n < 0) { perror("Fail to recvfrom"); exit(EXIT_FAILURE); } printf("key = %s\n",buf); login_flag = (strncmp(buf,"root",4) == 0) ? LOGIN_SUCCESS : LOGIN_FAILURE; //说明此时秘钥正确 if(login_flag == LOGIN_SUCCESS) { packet.ip = (char *)ip; packet.flag = login_flag; packet.peer_addr = &client_addr; //创建子线程,子线程准备接收当前用户数据,主线程接续接收新用户的秘钥 pthread_create(&tid,NULL,message_thread,(void *)&packet); }else{ //秘钥不正确,使用原始端口回复信息 sendto(sockfd,&login_flag,sizeof(login_flag),0,(struct sockaddr *)&client_addr,len); } //把线程设置为分离式,子线程结束后,系统会自动回收资源 pthread_detach(tid); } return ; } //./a.out ip port int main(int argc, const char *argv[]) { int sockfd; unsigned char login_flag; if(argc < 3) { fprintf(stderr,"Usage : %s ip port!\n",argv[0]); exit(EXIT_FAILURE); } //1.接收用户的秘钥,准备登录 user_login(argv[1],argv[2]); return 0; }

得分 100
学习任务

qq_康斯坦丁_0 的学生作业:

#include #include #include #include #include #include #include // 子进程B的信号处理函数 void sig_handler(int signo) { printf(“子进程B收到信号: %s\n”, strsignal(signo)); } int main() { pid_t pid1, pid2; int status; // 创建第一个子进程(A) pid1 = fork(); if (pid1 < 0) { perror("创建子进程A失败"); exit(1); } if (pid1 == 0) { // 子进程A代码 printf("子进程A (PID: %d) 开始运行,使用默认信号处理方式\n", getpid()); while(1) { sleep(1); } exit(0); } else { // 父进程继续创建第二个子进程(B) pid2 = fork(); if (pid2 < 0) { perror("创建子进程B失败"); exit(1); } if (pid2 == 0) { // 子进程B代码 // 设置SIGUSR2的信号处理函数 if (signal(SIGUSR2, sig_handler) == SIG_ERR) { perror("设置信号处理函数失败"); exit(1); } printf("子进程B (PID: %d) 开始运行,使用自定义信号处理函数\n", getpid()); while(1) { sleep(1); } exit(0); } else { // 父进程代码 printf("父进程 (PID: %d) 创建了两个子进程: A(%d) 和 B(%d)\n", getpid(), pid1, pid2); // 等待3秒,让子进程有时间打印信息 sleep(3); // 向子进程A发送SIGUSR1信号 printf("\n父进程正在发送SIGUSR1信号给子进程A...\n"); if (kill(pid1, SIGUSR1) == 0) { printf("成功发送SIGUSR1信号给子进程A (PID: %d)\n", pid1); } else { perror("向子进程A发送SIGUSR1信号失败"); } // 向子进程B发送SIGUSR2信号 printf("\n父进程正在发送SIGUSR2信号给子进程B...\n"); if (kill(pid2, SIGUSR2) == 0) { printf("成功发送SIGUSR2信号给子进程B (PID: %d)\n", pid2); } else { perror("向子进程B发送SIGUSR2信号失败"); } // 等待一秒让信号处理完成 sleep(1); // 终止子进程 printf("\n父进程正在终止子进程...\n"); kill(pid1, SIGKILL); kill(pid2, SIGKILL); // 等待子进程结束 waitpid(pid1, &status, 0); printf("子进程A (PID: %d) 已终止\n", pid1); waitpid(pid2, &status, 0); printf("子进程B (PID: %d) 已终止\n", pid2); printf("\n所有子进程已终止,父进程退出\n"); } } return 0; }

得分 100
学习任务

qq_康斯坦丁_0 的学生作业:

#include #include #include #include #include #include int main() { pid_t pid1, pid2; int status; // 创建第一个子进程 pid1 = fork(); if (pid1 < 0) { perror("第一个子进程创建失败"); exit(1); } if (pid1 == 0) { // 第一个子进程代码 printf("子进程1 (PID: %d) 开始运行\n", getpid()); while(1) { sleep(1); } exit(0); } else { // 父进程继续创建第二个子进程 pid2 = fork(); if (pid2 < 0) { perror("第二个子进程创建失败"); exit(1); } if (pid2 == 0) { // 第二个子进程代码 printf("子进程2 (PID: %d) 开始运行\n", getpid()); while(1) { sleep(1); } exit(0); } else { // 父进程代码 printf("父进程 (PID: %d) 创建了两个子进程: %d 和 %d\n", getpid(), pid1, pid2); // 等待3秒,让子进程有时间打印信息 sleep(3); // 向两个子进程发送SIGKILL信号 printf("\n父进程正在发送SIGKILL信号给子进程...\n"); if (kill(pid1, SIGKILL) == 0) { printf("成功发送SIGKILL信号给子进程1 (PID: %d)\n", pid1); } else { perror("向子进程1发送SIGKILL信号失败"); } if (kill(pid2, SIGKILL) == 0) { printf("成功发送SIGKILL信号给子进程2 (PID: %d)\n", pid2); } else { perror("向子进程2发送SIGKILL信号失败"); } // 等待两个子进程结束 waitpid(pid1, &status, 0); printf("子进程1 (PID: %d) 已终止\n", pid1); waitpid(pid2, &status, 0); printf("子进程2 (PID: %d) 已终止\n", pid2); printf("\n所有子进程已终止,父进程退出\n"); } } return 0; }

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号