ls_prepare(argv[i],aflag,lflag);
}
printf("\n");
return0;
}
调试编译串行口通信程序p6.5.c
运行过程
由于权限问题,我们在root用户下运行程序
图表24使用./mytrunk不带参数运行
图表25使用./mytrunk/dev/ttyS00带参数运行
Linux第三次上机(运行环境RedHat,CentOS)
创建一个系统监听守护进程,一旦接收到其他进程发来的信号,马上给出报告
运行过程
图表26首先运行守护进程之后查看当前进程
图表27可以发现守护进程-jincheng在后台运行,且PPID=1,PID=4085
图表28可以发现守护进程向test.txt发送了start
图表29向守护进程发送终止信号,终止守护进程
图表30可以发现后台运行的守护进程没了
图表31可以发现守护进程又向test.txt发送了end
图表32具体查看test.txt
图表33具体查看test.txt的内容
源代码
#include
#include
#include
#include
#include
#include
#include
/*Daemonizemyself.*/
intfd1;
voidsigintHandler(intsig)
{
if(sig==SIGTERM)
{
write(fd1,"end\n",5);
exit(0);
}
}
intdaemon(intnochdir,intnoclose)
{
pid_tpid;
pid=fork();
/*Incaseofforkiserror.*/
if(pid<0)
{
perror("fork");
return-1;
}
/*Incaseofthisisparentprocess.*/
if(pid!
=0)
exit(0);
/*Becomesessionleaderandgetpid.*/
pid=setsid();
if(pid<-1)
{
perror("setsid");
return-1;
}
/*Changedirectorytoroot.*/
if(!
nochdir)
chdir("/");
/*Filedescriptorclose.*/
if(!
noclose)
{
intfd;
fd=open("/dev/null",O_RDWR,0);
if(fd!
=-1)
{
dup2(fd,STDIN_FILENO);
dup2(fd,STDOUT_FILENO);
dup2(fd,STDERR_FILENO);
if(fd>2)
close(fd);
}
}
umask(0027);
return0;
}
intmain(void)
{
fd1=open("test.txt",O_RDWR|O_TRUNC);
write(fd1,"start\n",7);
daemon(0,0);
signal(SIGTERM,sigintHandler);
sleep(1000);
return0;
}
分别利用本地socket套接字和INTENET套接字实现进程间文件传输
本地socket套接字运行过程
图表34使用./server1运行服务器,显示服务器等待状态
图表35当在另外一个终端运行客户端程序时,服务器显示客户连接,并要求输入传输文件名称
图表36当服务器输入文件名称server1.c后客户端显示接收信息,不过接收到的文件重定向到test.txt中
图表37server1.c的内容
图表38客户端接收到显示在test.txt的内容,和server1.c的内容比较,完全一致
本地socket套接字服务器server1.c源代码
#include
#include
#include
#include
#include
#include
#include
#include
intmain()
{
intfilefd,n;////////////////
charfile[100],buf[1024];////////////////
intserver_sockfd,client_sockfd;
intserver_len,client_len;
structsockaddr_unserver_address;
structsockaddr_unclient_address;
unlink("server_socket");
server_sockfd=socket(AF_UNIX,SOCK_STREAM,0);
server_address.sun_family=AF_UNIX;
strcpy(server_address.sun_path,"server_socket");
server_len=sizeof(server_address);
bind(server_sockfd,(structsockaddr*)&server_address,server_len);
listen(server_sockfd,5);
while
(1)
{
printf("serverwaiting\n");
client_len=sizeof(client_address);
client_sockfd=accept(server_sockfd,(structsockaddr*)&client_address,&client_len);
if(client_sockfd!
=-1)
{
printf("youhaveaclient,pleaseputthefilenametotransport!
!
\n");
scanf("%s",file);
if((filefd=open(file,O_RDWR))<0)
{
perror("can'tfindthefile");
exit
(1);
}
printf("filefd=%d\n",filefd);
printf("thefileistransported,pleasewait...\n");
lseek(filefd,0L,0);//每次接受客户机连接,应将用于读的源文件指针移到文件头
write(client_sockfd,file,sizeof(file));//传送文件名
if((n=read(filefd,buf,sizeof(buf)))>0)
{
write(client_sockfd,buf,n);
}
printf("youhavetransport%dbytesanditisend!
!
\n",n);
close(client_sockfd);
}
close(filefd);
}
}
本地socket套接字客户端client1.c源代码
#include
#include
#include
#include
#include
#include
#include
#include
intmain()
{
intfilefd,n,oldfilefd;/////////////////
charfile[100],buf[1024];
intsockfd;
intlen;
structsockaddr_unaddress;
intresult;
sockfd=socket(AF_UNIX,SOCK_STREAM,0);
address.sun_family=AF_UNIX;
strcpy(address.sun_path,"server_socket");
len=sizeof(address);
result=connect(sockfd,(structsockaddr*)&address,len);
if(result==-1)
{
perror("oops:
client1");
exit
(1);
}
if(result!
=-1)
{
oldfilefd=open("test.txt",O_RDWR);
filefd=dup(oldfilefd);
read(sockfd,file,sizeof(file));
printf("thefilenameyoureceiveis:
%s\n",file);
if((n=read(sockfd,buf,sizeof(buf)))>0)
{
write(filefd,buf,n);
}
printf("youhavereceivedafilewhichis%dbytes,butthefile'scontextcoverthetest.txt,sopleasecheckintotest.txt!
!
\n",n);
close(sockfd);
}
close(filefd);
exit(0);
}
INTENET套接字运行过程
图表39使用./server2运行服务器,显示服务器等待状态
图表40当在另外一个终端运行客户端程序时,服务器显示客户连接,并要求输入传输文件名称
图表41当服务器输入文件名称server2.c后客户端显示接收信息,不过接收到的文件重定向到test.txt中
图表42server2.c的内容
图表43客户端接收到显示在test.txt的内容,和server2.c的内容比较,完全一致
INTENET套接字服务器server2.c源代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
intmain()
{
intfilefd,n;////////////////
charfile[100],buf[4096];///////////////////
intserver_sockfd,client_sockfd;
intserver_len,client_len;
structsockaddr_inserver_address;
structsockaddr_inclient_address;
server_sockfd=socket(AF_INET,SOCK_STREAM,0);
server_address.sin_family=AF_INET;
server_address.sin_addr.s_addr=inet_addr("127.0.0.1");
server_address.sin_port=9734;
server_len=sizeof(server_address);
bind(server_sockfd,(structsockaddr*)&server_address,server_len);
listen(server_sockfd,5);
while
(1)
{
printf("serverwaiting\n");
client_len=sizeof(client_address);
client_sockfd=accept(server_sockfd,(structsockaddr*)&client_address,&client_len);
if(client_sockfd!
=-1)
{
printf("youhaveaclient,pleaseputthefilenametotransport!
!
\n");
scanf("%s",file);
if((filefd=open(file,O_RDWR))<0)
{
perror("can'tfindthefile");
exit
(1);
}
printf("filefd=%d\n",filefd);
printf("thefileistransported,pleasewait...\n");
lseek(filefd,0L,0);//每次接受客户机连接,应将用于读的源>文件指针移到文件头
write(client_sockfd,file,sizeof(file));//传送文件名
if((n=read(filefd,buf,sizeof(buf)))>0)
{
write(client_sockfd,buf,n);
}
printf("youhavetransport%dbytesanditi