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

作业社区

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

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

weixin_慕哥3021856 的学生作业:

#include #include #include #include #include #include #include #include #define BACKLOG 3 // 监听队列的长度 int main(int argc, const char *argv[]) { int sockfd, cfd, ret; struct sockaddr_in server_addr, client_addr; ssize_t rbytes = 0, sbytes = 0; char buffer[1024] = {0}; if (argc != 3) { fprintf(stderr, "Usage: %s \n", argv[0]); return -1; } socklen_t len = sizeof(struct sockaddr_in); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } bzero(&server_addr, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(argv[1]); server_addr.sin_port = htons(atoi(argv[2])); ret = bind(sockfd, (const struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)); if (ret == -1) { perror("[ERROR] bind()"); exit(EXIT_FAILURE); } ret = listen(sockfd, BACKLOG); if (ret == -1) { perror("[ERROR] listen()"); exit(EXIT_FAILURE); } printf("Server listening...\n"); cfd = accept(sockfd, (struct sockaddr *)&client_addr, &len); if (cfd == -1) { perror("[ERROR] accept()"); exit(EXIT_FAILURE); } printf("Connection established. Client ip: %s, port: %d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); for (;;) { rbytes = recv(cfd, buffer, sizeof(buffer), 0); if (rbytes == -1) { perror("[ERROR] recv()"); exit(EXIT_FAILURE); } else if (rbytes > 0) { if (strncmp(buffer, "quit", 4) == 0) { printf("Client < %s : %d > has exited.\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); break; } printf("Receive: %s\n", buffer); sbytes = send(cfd, buffer, strlen(buffer), 0); if (sbytes == -1) { perror("[ERROR] send()"); exit(EXIT_FAILURE); } memset(buffer, 0, sizeof(buffer)); } else if (rbytes == 0) { printf("Connection closed.\n"); break; } } close(sockfd); close(cfd); return 0; } 【图片】

得分 0
学习任务

胡汉三66 的学生作业:

#include #include #include #include #include #include #include //信号处理函数,可通过 signal 函数来关联对应的信号,地址注册到内核,由内核调用 //@param :描述函数参数 //@param sig:当前接收到的信号(与这个处理函数相关联) void do_sig_usr(int sig) { //将信号的编号转换成字符串形式 printf("Receive < %s >\n",strsignal(sig)); } int main(void) { pid_t cpid_a; __sighandler_t ret_a,ret_b;//__sighandler_t 为函数指针类型 ret_a = signal(SIGUSR1,SIG_DFL);//將 信号SIGUSR1 处理方式设置为默认 if (ret_a == SIG_ERR)//出错处理 { perror("[ERROR] signal_a():"); exit(EXIT_FAILURE); } //将 信号SIGUSR2 与信号处理函数do_sig_usr关联并(将函数地址)注册到内核中 ret_b = signal(SIGUSR2,do_sig_usr); if (ret_b == SIG_ERR)//出错处理 { perror("[ERROR] signal_b():"); exit(EXIT_FAILURE); } cpid_a = fork();//创建子进程A if (cpid_a == -1) { perror("[ERROR] fork_a(): "); exit(EXIT_FAILURE); }else if (cpid_a == 0)//子进程A { printf("child A < %d > start.\n",getpid()); pause();//子进程A暂停,等待信号唤醒.一旦收到信号,处理信号, printf("child A < %d > end.\n",getpid());//这段代码不执行,因为信号SIGUSR1默认处理是 进程退出 exit(EXIT_SUCCESS); }else if (cpid_a > 0)//父进程 { sleep(2);//父进程延时1s,让子进程A先执行 kill(cpid_a,SIGUSR1);//父进程给子进程A发送SIGUSR1信号, pid_t cpid_b = fork();//创建子进程B if (cpid_b == -1) { perror("[ERROR] fork_b(): "); exit(EXIT_FAILURE); }else if(cpid_b == 0)//子进程B { printf("child B < %d > start.\n",getpid()); pause();//子进程B暂停,等待信号唤醒.一旦收到信号,处理信号,再执行子进程剩余代码 printf("child B < %d > end.\n",getpid()); exit(EXIT_SUCCESS); }else if(cpid_b > 0)//父进程 { sleep(3);//父进程延时3s,让子进程B先执行 kill(cpid_b,SIGUSR2);//父进程给子进程B发送SIGUSR2信号 } wait(NULL); } return 0; } 【图片】

得分 100
学习任务

胡汉三66 的学生作业:

#include #include #include #include #include #include int main(void) { pid_t cpid_a; cpid_a = fork();//创建子进程A if (cpid_a == -1) { perror("[ERROR] fork_a(): "); exit(EXIT_FAILURE); }else if (cpid_a == 0)//子进程A { fprintf(stdout,"\tchild A %d running.\n",getpid()); raise(SIGSTOP);//子进程发送 SIGSTOP 信号 fprintf(stdout,"\tchild A %d exit.\n",getpid());//没有输出这句话,因为信号SIGKILL:处理方式是结束进程 exit(EXIT_SUCCESS); }else if (cpid_a > 0)//父进程 { int ret_a; sleep(1);//父进程睡眠,让子进程A先执行 ret_a = kill(cpid_a,SIGKILL);//父进程给子进程A发送SIGKILL信号,默认操作:结束进程 if (ret_a == 0){ fprintf(stdout,"Father %d Killed child A %d\n",getpid(),cpid_a); } pid_t cpid_b = fork();//创建子进程B if (cpid_b == -1) { perror("[ERROR] fork_b(): "); exit(EXIT_FAILURE); }else if(cpid_b == 0)//子进程B { fprintf(stdout,"\tchild B %d running.\n",getpid()); raise(SIGSTOP);//子进程发送 SIGSTOP 信号 fprintf(stdout,"\tchild B %d exit.\n",getpid());//没有输出这句话,因为信号SIGKILL:处理方式是结束进程 exit(EXIT_SUCCESS); }else if(cpid_b > 0)//父进程 { int ret_b; sleep(3);//父进程睡眠,让子进程B先执行 ret_b = kill(cpid_b,SIGKILL);//父进程给子进程B发送SIGKILL信号,默认操作:结束进程 if (ret_b == 0){ fprintf(stdout,"Father %d Killed child B %d\n",getpid(),cpid_b); } } wait(NULL); } return 0; } 【图片】

微信客服

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

帮助反馈 APP下载

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

公众号

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