Linux系统编程答案.docx
《Linux系统编程答案.docx》由会员分享,可在线阅读,更多相关《Linux系统编程答案.docx(8页珍藏版)》请在冰豆网上搜索。
Linux系统编程答案
《Linux系统编程》机试试卷答案
一.编程题:
(共4题100分)
1、利用文件描述符的方式实现将a.txt中的内容拷贝到b.txt中
(运行:
./cpa.txtb.txt)
#include
#include
#include
#include
char*res="copysucceed!
\n";
char*fail="illegalparameter!
\n";
int
main(intargc,char**argv)
{
if(argc!
=3){
write(STDOUT_FILENO,fail,strlen(fail));
exit
(2);
}
intfdin,fdout;
if((fdin=open(argv[1],O_RDONLY))==-1){
exit
(2);
}
if((fdout=
open(argv[2],O_WRONLY|O_CREAT,0777))==-1){
exit
(2);
}
charbuff[256];
ssize_tnreads;
while((nreads=read(fdin,buff,256))!
=0){
if(write(fdout,buff,nreads)!
=nreads){
exit
(2);
}
}
close(fdin);
close(fdout);
write(STDOUT_FILENO,res,strlen(res));
return0;
}
2.
#include
#include
#include
#include
#include
#include
intglobal=6;
charoutstr[]="parentprocessbegin!
\n";
int
main(void)
{
pid_tpid;
intvalue=88;
write(STDOUT_FILENO,outstr,sizeof(outstr)-1);
printf("beginforking\n");
if((pid=fork())==-1){
printf("forkerror\n",strerror(errno));
exit
(2);
}
if(pid==0){
global++;
value++;
}
if(pid>0)sleep
(2);
printf("processidis%d,globalis%d,valueis%d\n",pid,global,value);
exit(0);
}
3.
#include
#include
#include
#include
voidsignal_handler(int);
int
main(void)
{
pid_tpid;
if(signal(SIGCHLD,signal_handler)
==SIG_ERR){
printf("signalerror\n");
}
if((pid=fork())<0){
printf("forkerror\n");
}elseif(pid>0){//parent
inti=0;
for(;;){
printf("parent:
iis
%d\n",++i);
sleep
(1);
}
}else{//child
inti=0;
for(;i<10;i++){
printf("child:
iis
%d\n",i);
sleep
(2);
}
_exit(0);
}
exit(0);
}
void
signal_handler(intsigno)
{
if(signo==SIGCHLD){
printf("childprocessdead!
\n");
wait(NULL);
exit(0);
}
}
4.
#include
#include
#include
#include
void*
th_fn(void*arg)
{
inti=1;
char*n=(char*)arg;
for(i=1;i<=100;i++){
printf("%s,%d\n",n,i);
}
}
int
main(void)
{
pthread_attr_tattr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(
&attr,PTHREAD_CREATE_DETACHED);
pthread_ttid;
interr;
if((pthread_create(
&tid,&attr,th_fn,"detached"))!
=0){
printf("pthreadcreateerror\n");
}
if((err=pthread_join(tid,NULL))!
=0){
printf("joinerror\n",strerror(err));
}
return0;
}
5.
服务器端:
#include
#include
#include
#include
#include
#include
#include
#defineSOCKADDRstructsockaddr
void
out(structsockaddr_in*adr)
{
charstr[16];
printf("sockaddress\t%s:
%d\n",
inet_ntop(AF_INET,
(SOCKADDR*)&adr->sin_addr.s_addr,str,16),
ntohs(adr->sin_port));
}
int
main(void)
{
intport=8888;
intfd;
structsockaddr_inserver,client;
//1constructsocketforIPV4andTCP
if((fd=socket(AF_INET,SOCK_STREAM,0))==-1){
printf("socketerror:
%s\n",strerror(errno));
exit
(2);
}
//2constructaddressstructandinitialization
memset(&server,0,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(port);
server.sin_addr.s_addr=INADDR_ANY;
//inet_pton(AF_INET,"172.16.1.17",&server.sin_addr.s_addr);
//3bindsockettoaddress
if(bind(fd,(SOCKADDR*)&server,
sizeof(server))==-1){
printf("binderror\n");
exit
(2);
}
//4notifythekernelacceptingconnectionrequest
listen(fd,0);
socklen_tlen=sizeof(client);
while
(1){
//5waitingfortheclientconnection
intsockfd=accept(fd,(SOCKADDR*)&client,&len);
out(&client);
time_tt=time(NULL);
char*p=ctime(&t);
//6sendthedata
write(sockfd,p,strlen(p));
//7closethesocket
close(sockfd);
}
close(fd);
}
客户端:
#include
#include
#include
#include
#include
#include
#include
int
main(intargc,char**argv)
{
intfd;
structsockaddr_inserver;
//1constructthesocketforipv4andtcp
if((fd=socket(AF_INET,SOCK_STREAM,0))==-1){
printf("socketerror:
%s\n",strerror(errno));
exit
(2);
}
//2constructserveraddress
memset(&server,0,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],
(structsockaddr*)&server.sin_addr.s_addr);
//3connecttotheserver
if(connect(fd,
(structsockaddr*)&server,sizeof(server))==-1){
printf("cannotconnecttoserver:
%s\n",
strerror(errno));
}
//4readdatafromnetwork
charbuff[1024];
intnreads=read(fd,buff,sizeof(buff));
//5processthedata
write(STDOUT_FILENO,buff,nreads);
//6closethesocket
close(fd);
}