Linux系统程序设计课后习题答案
Linux程序设计课后习题答案
开学考试的练习。⽼师居然不给答案,那只能⾃⼰上了。因为个⼈能⼒有限,选择题部分可能有错误。编程题部分,确保已经在linux上运⾏通过后且⽆误后才贴上来。
第⼀章
简答题
3.简述系统调⽤和库函数区别
系统调⽤是直接调⽤linux系统中的接⼝,库函数则是调⽤c语⾔库中的接⼝。
第⼆章
填空题
1.vi 三种⼯作模式(命令模式,插⼊模式,末⾏模式)
<⽣成可执⾏⽂件四个过程(预处理,编译,汇编,连接)
5,库分为(静态库,共享库) 我还是⽐较习惯叫动态库,不过考试嘛,没法。
编程题
2.编写⼀个makefile,⾃动编译当前⽬录下全部的c⽂件。(完整题⽬太长了,就不写了)
OURCE=$(wildcard *.c)
OBJECT=$(patsubst %.c,%.o,$(SOURCE))
%:%.c
cc $^ -o $@
all:${OBJECT}
clean:
rm -f ${OBJECT}
第三章
编程题
2.获取当前系统时间,并按命令data的显⽰⽅式打印出来。
int main(){
size_t nowtime;
time(&nowtime);
struct tm *nowtime1 =localtime(&nowtime);
printf("%d %d %d %d %d %d %d ",nowtime1->tm_year+1900,
nowtime1->tm_mon+1,nowtime1->tm_mday,nowtime1->tm_wday,
nowtime1->tm_hour,nowtime1->tm_min,nowtime1->tm_sec);//简单的搞⼀下了
}
3.获取⽤户输⼊的年⽉⽇分秒,并设置为系统时间
(⽞学修改,因为我linux上已经有服务接管时间控制,会导致修改了马上⼜被改会去)
#include<stdio.h>
#include<time.h>
#include<sys/time.h>
int main(){
struct tm time_tm;
struct timeval time_tv;
time_t timep;
scanf("%d-%d-%d %d:%d:%d",&_year,&_mon,
&_mday,&_hour,&_min,
&_sec);
_year -=1900;
_mon -=1;
timep =mktime(&time_tm);
time_tv.tv_sec = timep;
time_tv.tv_usec =0;
settimeofday(&time_tv,NULL);
}
第四章
选择题
2.linux⽂件系统的根⽬录的i节点号为(2)
4.设置⽂件偏移量的系统调⽤是(lseek)
5.哪⼀个不是lseek第三个参数的取值(SEEK_NOW)
简答题
3.读程序,写出执⾏结果,并解释得到该结果的原因。
int main(){
int fd1,fd2;
fd1 =open("/etc/passwd",O_RDONLY);
fd2 =open("/etc/passwd",O_RDWR);
printf("%d %d",fd1,fd2);
}
```bash
结果为3-1.因为第⼀个成功读取,第⼆个因为linux普通⽤户没有写权限所以返回-1
编程题
6.实现 cp 源⽂件 ⽬标⽂件
#include<fcntl.h>
void cp(char*,char*);
int main(int argc ,char**argv){
if(argc !=3){
exit(1);
}
cp(*(argv+1),*(argv+2));
}
void cp(char*from,char*to){
char buf[20];
int from_fd =-1, to_fd =-1;
ssize_t nread;
if((from_fd =open(from,O_RDWR))==-1){
printf("fail open 1");
exit(1);
}
if((to_fd =open(to ,O_RDWR| O_CREAT ,0777))==-1){ printf("fail open 2");
exit(1);
}
//printf("3");
nread =read(from_fd,buf,sizeof(buf));
linux下的sleep函数while(nread >0){
if(write(to_fd,buf,nread)!= nread)
printf("write %s error",to_fd);
nread =read(from_fd,buf,sizeof(buf));
}
close(from_fd);
close(to_fd);
return;
}
第五章
编程题
2.实现“ls -l ⽂件名”功能
#include<fcntl.h>
#include<string.h>
#include<sys/stat.h>
#include<pwd.h>
#include<grp.h>
int fl_date(char*);
int main(int argc,char const*argv[])
{
if(argc !=3|(strcmp(argv[1],"-l")!=0))
error(1);
fl_date(argv[2]);
}
int fl_date(char*file){
struct stat fl_stat;
struct passwd *user;
struct group *grp;
int t;
t =stat(file,&fl_stat);
if(t ==-1)
exit(1);
/
/print
if(S_ISREG(fl_stat.st_mode))//⽂件类型
printf("-");
else if(S_ISDIR(fl_stat.st_mode))
printf("d");
else if(S_ISCHR(fl_stat.st_mode))
printf("l");
else
printf("e");//好多,摸了
putchar(fl_stat.st_mode & S_IRUSR ?'r':'-');//权限putchar(fl_stat.st_mode & S_IWUSR ?'r':'-');
if(fl_stat.st_mode & S_IXUSR)
putchar(fl_stat.st_mode & S_IXUSR ?'s':'S'); else
putchar(fl_stat.st_mode & S_IXUSR ?'x':'-'); putchar(fl_stat.st_mode & S_IRGRP ?'r':'-'); putchar(fl_stat.st_mode & S_IWGRP ?'r':'-');
if(fl_stat.st_mode & S_ISGID)
putchar(fl_stat.st_mode & S_IXGRP ?'s':'S'); else
putchar(fl_stat.st_mode & S_IXGRP ?'x':'-'); putchar(fl_stat.st_mode & S_IROTH ?'r':'-'); putchar(fl_stat.st_mode & S_IWOTH ?'r':'-');
if(fl_stat.st_mode & S_ISVTX)
putchar(fl_stat.st_mode & S_IXOTH ?'s':'S'); else
putchar(fl_stat.st_mode & S_IXOTH ?'x':'-'); printf(" %u",fl_stat.st_nlink);//拥有者,拥有组
user =getpwuid(fl_stat.st_uid);
printf(" %s",user->pw_name);
grp =getgrgid(fl_stat.st_gid);
printf(" %s",grp->gr_name);
printf(" %u",fl_stat.st_size);//⼤⼩和时间
printf(" %s",ctime(&(fl_stat.st_ctime)));
}
第六章
编程题
7.实现”cp ⽬录 ⽬录“功能,不必处理符号链接,硬链接,不必保持所有权限,时间。
#include<stdio.h>
#include<time.h>
#include<sys/time.h>
#include<stdlib.h>
#include<fcntl.h>
#include<string.h>
#include<sys/stat.h>
#include<pwd.h>
#include<grp.h>
#include<dirent.h>
void cp_dir(char*,char*);
int main(int argc,char const*argv[])
{
if(argc !=4||strcmp(argv[1],"-r"))//cp -r ⽬录⽬录
exit(1);
cp_dir(argv[2],argv[3]);
return0;
}
void cp_dir(char*from,char*to){
int f_from,f_to;
struct stat s_from,s_to;
char buf[256];
int nread;
if((f_from =open(from,O_RDWR))==-1)
exit(1);
if((f_to =open(to,O_RDWR | O_CREAT | O_TRUNC))==-1)
exit(1);
nread =read(f_from,buf,sizeof(buf));
while(nread >0)
{
if(write(f_to,buf,sizeof(buf))==-1);
exit(1);
nread =read(f_from,buf,sizeof(buf));
}
close(f_from);
close(f_to);
}
第七章
编程题
1.使⽤fork创建进程,在⼦进程中打印“ i an the child"和pid,在⽗进程打印“ i an the father"和pid。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论