当前位置:文档之家› Linux期末复习(有参考答案)

Linux期末复习(有参考答案)

Linux期末复习1.UNIX/Linux系统中条件变量需要和什么机制配合互斥锁。

2.Linux多线程编程中,触发pthread_cond_wait返回的条件pthread_cond_signal() 或 pthread_cond_broadcast() 唤醒,并且互斥锁在解锁状态。

3.不同进程共享相同文件表项的情况不同进程共享同一个文件表项(父子进程)4.进程从main()函数开始执行,它的异常结束方式1.调用abort,产生SIGABRT信号2.接收到终止信号5.在UNIX/Linux命令中实现标准输入重定向command < input-file6.文件要取消该文件的文件所有者的执行权限,同时增加该文件的同组用户的写权限,可以使用的命令chmod u-x file; chmod g+w fileLinux系统中的标准错误的文件描述符值标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 28.调用fork函数后该函数返回值为0,1的意义0为子进程,1为父进程9.进程间通信的共享内存机制XSI IPC10.指定所等待子进程的ID又可以请求内核返回子进程使用的资源情况汇总函数wait3,wait4类函数中哪个可以通过环境变量PATH来指定路径execlp12.调用lseek函数时,设置第三个参数为SEEK_CUR的意义将该文件的偏移量设置为距文件当前位置加offset个字节;Linux系统中每个文件有9个文件权限位,按照访问文件的用户身份不同可以将这些文件权限位分为三个域,分别是哪些域文件所有者,同组用户,其他用户14.在UNIX/Linux系统中C程序内存空间布局包括哪些段栈,堆,非初始化数据段,初始化数据段,正文段Linux系统为每个进程自动打开三个文件,是什么文件标准输入、标准输出和标准错误文件IPC机制包括哪些内容信号量,消息队列,内存共享17.在UNIX/Linux系统中,为了在一个目录中创建一个新文件,必须对该目录具有什么权限写入权限和执行权限18.进程和线程有哪些区别以及Linux系统提供了哪些线程同步机制1.线程是进程内的独立执行实体和调度单元。

进程有独立的地址空间,线程没有;线程是处理器调度的基本单位,但进程不是;进程是资源分配和拥有的单位,线程只能和同一个进程内的线程共享进程的资源.2.互斥量,读写锁,条件变量19.在UNIX/Linux系统中可以认为操作系统用了三张表来描述一个打开的文件,哪三张表这三张表各自描述了文件的哪些属性它们之间是如何联系起来的1.文件描述符表,文件表,索引节点表2.文件描述符表:文件描述符标志,指向一个文件表项的指针。

文件表:文件状态标志,文件读写偏移量,指向该文件索引节点表项的指针。

索引节点表:文件属性,数据块位置,当前文件长度。

3.通过指针指向对应表项20.在UNIX/Linux系统中/etc/shadow文件用来存储用户密码,所有用户都可以通过执行passwd命令(/usr/bin/passwd)修改自己的秘密(修改/etc/shadow文件),但非root的其他用户对/etc/shadow文件没有读写权限。

为什么所有用户都可以通过执行passwd命令修改自己的密码(修改/etc/shadow文件)这是因为用户执行“/usr/bin/passwd”命令时,/usr/bin/passwd 文件设置了setuid位,在执行此程序(/usr/bin/passwd)时,该用户所拥有的权限等同于文件“/usr/bin/passwd”的拥有者root的权限,而root用户拥有对/ect/passwd文件写的权限,因此普通用户可以通过/usr/bin/passwd来修改/etc/shadow文件的内容。

21.在UNIX系统下利用C语言编程,通过使用多线程和条件变量实现以下两个线程的同步工作:线程A与线程B互斥地访问共享资源count(整形,全局变量,其初值为0)线程A判断count的值是否大于0,如果大于0则执行count=count-1操作,循环往复线程B执行count=count+1操作,循环往复在main函数中首先创建线程A,再创建线程B#include <>#include <>#include <>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/void *threadA(void *);void *threadB(void *);int count = 0;int main(void){pthread_t A;pthread_t B;pthread_create(&A,NULL,threadA,(void *)NULL);/*创建进程A*/pthread_create(&B,NULL,threadB,(void *)NULL); /*创建进程B*/pthread_join(A, NULL);/*等待进程A结束*/pthread_join(B, NULL);/*等待进程B结束*/pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);exit(0);}void *threadA(void *junk){while(1){pthread_mutex_lock(&mutex);/*锁住互斥量*/if(count > 0){count -= 1;}pthread_cond_signal(&cond);/*条件改变,发送信号,通知t_b进程*/pthread_mutex_unlock(&mutex);/*解锁互斥量*/printf("%d\n", count);}}void *threadB(void *junk){while(1){pthread_mutex_lock(&mutex);count += 1;pthread_cond_wait(&cond,&mutex);/*解锁mutex,并等待cond改变*/pthread_mutex_unlock(&mutex);}}22.在LInux系统下利用C语言编程,实现一个程序,该程序功能类似于一个简单的shell程序,其具体要求为:从标准输入读取输入的命令名/可执行文件名(要求用户输入的命令名和和可执行文件名为绝对路径,可以不考虑参数传递),以回车作为命令/可执行文件名输入的结束,然后创建子进程执行对应的命令/可执行文件,此时程序本身不再进行任何操作直到当前命令/可执行文件执行结束为止;该程序一次只执行一条命令/可执行文件,不需要考虑输入输出重定向和管理,不需要考虑信号处理。

#include<sys/>#include<sys/>#include<>#include<>#include<>int main(int argc,char *argv[]){if(argc < 2){printf("Usage: %s command\n",argv[0]);return 0;}pid_t pid;int status;if((pid = fork())<0){printf("fork error\n");return 0;}if(pid = 0){execl("/bin/sh", "sh", "-c", argv[1], (char *) 0);exit(0);}else{waitpid(pid, &status, 0);}return 0;}23.在Linux系统下利用C语言编程,实现一个程序,该程序可以实现ls -l 命令的功能。

(要求给出C语言代码或者给出关键代码并通过流程图及描述代码结构)。

#include ""#include ""#include ""#include ""#include ""void print_error(char *errmsg){printf("ERROR: %s\n",errmsg);exit(0);}char *getformattime(time_t t){static char formattime[20];struct tm *lt;lt = localtime(&t);char tmptime[24];memset(tmptime, 0, sizeof(tmptime));strftime(tmptime, 24, "%Y-%m-%d %H:%M:%S", lt);strcpy(formattime,tmptime);return formattime;}char *getuserinfo(uid_t my_uid){char username[100];char groupname[100];static char userinfo[200];struct passwd *my_info;struct group *grp;my_info = getpwuid(my_uid);strcpy(username,my_info->pw_name);grp = getgrgid(my_info->pw_gid);if (!grp){strcpy(groupname,"-");}else{strcpy(groupname,grp->gr_name);}strcat(username,"\t");strcat(username,groupname);strcpy(userinfo,username);return userinfo;}char *getinfo(char *path){static char str[1000];struct stat info;stat(path,&info);strcpy(str, "----------");if (S_ISDIR){str[0] = 'd';}else if (S_ISCHR) {str[0] = 'c';}else if (S_ISBLK) {str[0] = 'b';} else{str[0] = '-';}if & S_IRUSR) {str[1] = 'r';}if & S_IWUSR) {str[2] = 'w';}if & S_IXUSR) {str[3] = 'x'; }if & S_IRGRP) { str[4] = 'r'; }if & S_IWGRP) { str[5] = 'w'; }if & S_IXGRP){ str[6] = 'x'; }if & S_IROTH) { str[7] = 'r'; }if & S_IWOTH) { str[8] = 'w'; }if & S_IXOTH) {str[9] = 'x';}char tmp[20];strcat(str," ");sprintf(tmp,"%ld",;strcat(str,tmp);strcat(str," ");strcat(str,getuserinfo);strcat(str," ");sprintf(tmp,"%20ld",; strcat(str,tmp);strcat(str," ");strcat(str,getformattime); return str;int main(int argc,char *argv[]){DIR *dp ;struct dirent *dirp;int max_dir_length = sysconf(_PC_PATH_MAX);char dir[max_dir_length];if (argc != 2) {char buf[max_dir_length];if(getcwd(buf,max_dir_length)){strcpy(dir,buf);}else{print_error("Dir is too long or something error!");}}else{strcpy(dir,argv[1]);}if ((dp = opendir(dir)) == NULL) {print_error("Read dir failed!");}char tmp_dir[max_dir_length];while ((dirp = readdir(dp)) != NULL) {if(strcmp(dirp->d_name,"..") &&strcmp(dirp->d_name,".")){strcpy(tmp_dir,dir);strcat(tmp_dir,"/");printf("%s %s\n",getinfo(strcat(tmp_dir,dirp->d_name)),d irp->d_name);}}closedir(dp);exit(0);}。

相关主题