2022年完整word版,Linux程序设计参考答案 .pdf
第1页扬州大学试题纸 -参考答案(20122013学年第 一 学期) 广陵学院计科 80901、80902 班(年)级课程 Linux 程序设计 (B )卷参考答案题目一二三四五总分得分阅卷人一、Linux 的 ps 命令可以得到当前运行的进程列表,执行如下命令:rootlocalhost nova# ps -elf F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD 4 S root 1 0 0 80 0 - 4840 poll_s 06:50 ? 00:00:01 /sbin/init 1 S root 2 0 0 80 0 - 0 kthrea 06:50 ? 00:00:00 kthreadd 1 S root 3 2 0 -40 - - 0 migrat 06:50 ? 00:00:14 migration/0 4 S rtkit 3401 1 0 81 1 - 42113 poll_s 06:51 ? 00:00:00 /usr/libexec/rtkit-daemon 0 S root 3404 3252 0 80 0 - 34311 poll_s 06:51 ? 00:00:00 pam: gdm-password 4 S root 4222 2144 0 80 0 - 24534 poll_s 06:57 ? 00:00:14 sshd: rootpts/0 4 S root 4224 4222 0 80 0 - 27107 wait 06:57 pts/0 00:00:02 -bash 输出信息中包含了进程的PID ,要求编写一个Shell 程序getpid.sh,用户输入getpid.sh sshd 后,将输出该进程的PID 。 (本程序大概2 到 5 行)#! /bin/bash $|grep - i sshd | gawk print $2 二、使用 SDL 多媒体函数库,编写一段程序,实现在屏幕上画一个圆及一个矩形(图形大小及颜色自定)。主要查看在作图之前,是否正确进行初始化:调用SDL_Init 函数,及设置绘图视口( view)的大小#include #include 得分得分学院_系_班级_学号_姓名_.装.订.线名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 10 页 - - - - - - - - - 第2页#include #define RADIUS 50 #define LENGTH 100 #define WIDTH 62 int main(int argc, char * argv) SDL_Surface *screen; if(SDL_Init(SDL_INIT_VIDEO) format, 255,255,0); Draw_Rect(screen, 300, 200, LENGTH, WIDTH, SDL_MapRGB(screen-format, 255,255,0); SDL_UpdateRect(screen, 0, 0, 0, 0); SDL_Delay(5000); return EXIT_SUCCESS; 三、编写一个程序,要求实现:主进程调用fork 函数创建两个子进程(为简化表述,分别用A 进程、 B 进程表示这两个进程) 。A、B 进程通过有名管道实现通信,其中A 进程向 B 子进程发送字符串“ABC ”后,退出。 B 进程收到该字符串后,在屏幕上打印该字符串,然后退出。主要检查学生是否能正确使用mkfifo 创建有名管道,以及读写管道是否能够正确设置。答案:得分名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 10 页 - - - - - - - - - 第3页#include #include #include #include #include #include #include #define FIFONAME ./NamedFIFO int main(void) int fd; pid_t pidA,pidB; char buf8; pidA = fork(); if (pidA 0)/父进程pidB = fork(); if(pidB 0) fprintf(stdout,progress B create error!n); exit(0); else if(pidB = 0)/子进程 B 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 10 页 - - - - - - - - - 第4页if(access(FIFONAME,F_OK) = -1) mkfifo(FIFONAME, 0666); fd = open(FIFONAME,O_RDONLY); if(read(fd,buf,3) = -1) perror(prosess B read faild!n); printf(recevice from A: %sn, buf); close(fd); exit(0); waitpid(pidA,NULL,0); waitpid(pidB,NULL,0); exit(0); 四、 POSIX 定义的 socket(套接字)可以实现两台计算机间通信。编写一段程序,实现采用套接字在两机间通信。本处只要求写出服务器端程序。主要考查学生有关socket 通信函数调用次序,服务器端要求的调用次序为:socket、bind、listen、accept、recv、send、close 。答案:#include #include #include #include #include #include #include #include 得分名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 10 页 - - - - - - - - - 第5页#include #define PORT 65510 #define LISTEN_NUMBER 10 int flag = 0; void *client_func(void *p) printf(come in thread!n); int socket_client_fd = *(int *)p); char buf100; while(1) recv(socket_client_fd,buf,sizeof(buf),0); fputs(buf,stdout); if(strncmp(buf,quit,4)=0) printf(exit!n); break; flag =1; pthread_exit(NULL); /* 客户端部分代码不需要*/ int main() int socket_fd; if(socket_fd = socket(PF_INET,SOCK_STREAM,0) = -1) perror(socket failed!n); exit(0); printf(socket ok!n); struct sockaddr_in server_sockaddr; server_sockaddr.sin_family = AF_INET; server_sockaddr.sin_port = htons(PORT); server_sockaddr.sin_addr.s_addr = INADDR_ANY; int val = 1; setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(int); bzero(&server_sockaddr.sin_zero,sizeof(server_sockaddr.sin_zero); if(bind(socket_fd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 10 页 - - - - - - - - - 第6页= -1) perror(bind failed!n); goto QUIT; printf(bind ok!n); if(listen(socket_fd,LISTEN_NUMBER) = -1) perror(listen failed!n); goto QUIT; printf(listenning.n); int socket_client_fd; struct sockaddr_in client_sockaddr; socklen_t addr_len = sizeof(client_sockaddr); char input10; pthread_t tid; int err; if(socket_client_fd = accept(socket_fd,(struct sockaddr *)&client_sockaddr,&addr_len) 0) perror(accept failed!n); goto QUIT; if(err = pthread_create(&tid,NULL,client_func,(void *)&socket_client_fd) !=0) fprintf(stdout,pthread create:%sn,strerror(err); goto QUIT2; /* 客户端部分代码不需要*/fcntl(fileno(stdin),F_SETFL,fcntl(fileno(stdin),F_GETFL)|O_NONBLOCK); while(1) if(fgets(input,sizeof(input),stdin)!= NULL) send(socket_client_fd,input,sizeof(input),0); if(strncmp(input,quit,4) = 0) pthread_cancel(tid); pthread_join(tid,NULL); goto QUIT; if(flag = 1) break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 10 页 - - - - - - - - - 第7页 QUIT2: fprintf(stdout,exit!n); if(close(socket_client_fd) = -1) perror(close socket client failed!n); pthread_exit(NULL); /* 客户端部分代码不需要*/QUIT: if(close(socket_fd) = -1) perror(close socket failed!n); exit(0); exit(0); 五、编写 Linux 字符设备驱动程序的一般方法。需要实现init_module 函数,在该函数中要求:1、分配设备号及子设备号;2、设置设备对外接口;3、如有需要,分配内存作为设备的缓冲区;4、注册设备;需要实现cleanup_module 函数,该函数需要完成设备分配资源的释放。答案:#include #include #include #include #define BUFSIZE 4096 static struct dev_t dev_id; int count; 得分名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 10 页 - - - - - - - - - 第8页 char *name; struct cdev dev; char bufBUFSIZE; int len; my_dev = .count = 1, .name = my_dev_id, .buf = hello charn, .len = 11, ; static ssize_t my_read(struct file *filp, char _user *buffer, size_t size, loff_t *off) int ret; size = min(size, (size_t)(my_dev.len - *off); if (size = 0) return 0; ret = copy_to_user(buffer, my_dev.buf + *off, size); if (ret != 0) return -1; *off += size; return size; static ssize_t my_write(struct file *filp, const char _user *buffer, size_t size, loff_t *off) int ret; size = min(size, (size_t)BUFSIZE); ret = copy_from_user(my_dev.buf, buffer, size); if (ret != 0) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 10 页 - - - - - - - - - 第9页 return -1; my_dev.len = size; *off = size; return size; static int my_open(struct inode *inode, struct file *filp) return 0; static int my_release(struct inode *inode, struct file *filp) return 0; static struct file_operations fops = .owner = THIS_MODULE, .read = my_read, .write = my_write, .open = my_open, .release = my_release, ; static int _init my_init(void) int ret; my_dev.dev_id = MKDEV(93, 0); ret = register_chrdev_region(my_dev.dev_id, my_dev.count, my_dev.name); if (ret 0) printk(register_chrdev_region() failedn); goto register_chrdev_region_err; cdev_init(&my_dev.dev, &fops); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 10 页 - - - - - - - - - 第10页 ret = cdev_add(&my_dev.dev, my_dev.dev_id, my_dev.count); if (ret 0) printk(cdev_add() failedn); goto cdev_add_err; return 0; cdev_del(&my_dev.dev); cdev_add_err: unregister_chrdev_region(my_dev.dev_id, my_dev.count); register_chrdev_region_err: return -1; static void _exit my_exit(void) cdev_del(&my_dev.dev); unregister_chrdev_region(my_dev.dev_id, my_dev.count); module_init(my_init); module_exit(my_exit); MODULE_LICENSE(GPL); MODULE_AUTHOR(ME); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 10 页 - - - - - - - - -