看程序系统调用流程-strace使用
2014-05-27 12:29
411 查看
服务器:注意accept处有错的
/*
先看TCP服务器端的程序:
*/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define PORT 10000
int main(int argc, char *argv[])
{
int sockfd,new_fd = 0;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size;
int nbytes;
char buffer[1024];
/* 服务器端开始建立sockfd描述符 */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
exit(1);
}
/* 服务器端填充 sockaddr结构 */
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(PORT);
/* 捆绑sockfd描述符到IP地址 */
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
exit(1);
}
/* 设置允许连接的最大客户端数 */
if(listen(sockfd,5)==-1)
{
fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
exit(1);
}
while(1)
{
/* 服务器阻塞,直到客户程序建立连接 */
memset(buffer, '\0', sizeof(buffer));
sin_size=sizeof(struct sockaddr_in);
if(new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size)==-1)
{
fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
exit(1);
}
char IPdes[16]="";
inet_ntop(AF_INET, (void *)&client_addr.sin_addr, IPdes, 16);
fprintf(stderr,"Server get connection from %s\n",IPdes);
if((nbytes=read(new_fd,buffer,1024))==-1)
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
exit(1);
}
buffer[nbytes]='\0';
printf("Server received %s\n",buffer);
}
/* 结束通讯 */
close(sockfd);
exit(0);
}
客户端:
/*
再看客户端的程序:
*/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 10000
int main(int argc, char *argv[])
{
int sockfd;
char buffer[1024] = "hello";
struct sockaddr_in server_addr;
/* 客户程序开始建立 sockfd描述符 */;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(PORT);
inet_pton(AF_INET,"127.0.0.1",&server_addr.sin_addr.s_addr);
again:
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
goto again;
}
if(write(sockfd,buffer,strlen(buffer)) <= 0)
{
goto again;
}
printf("write ok\n");
return 0;
}
先运行tcpserver
再运行:
root@ubuntu:/mnt/hgfs/ubuntu-share/eclipse-work/tcpclient/Debug# ps -ef | grep tcpserver
root 12254 9880 0 21:18 pts/2 00:00:00 ./tcpserver
root 12257 9892 0 21:19 pts/3 00:00:00 grep --color=auto tcpserver
root@ubuntu:/mnt/hgfs/ubuntu-share/eclipse-work/tcpclient/Debug# st
start start-pulseaudio-x11 stat stdbuf strings
startpar start-stop-daemon static-sh stop strip
start-pulseaudio-kde startx status strace stty
root@ubuntu:/mnt/hgfs/ubuntu-share/eclipse-work/tcpclient/Debug# strace -p 12254
Process 12254 attached - interrupt to quit
accept(3, {sa_family=AF_INET, sin_port=htons(46666), sin_addr=inet_addr("127.0.0.1")}, [16]) = 4
write(2, "Server get connection from 127.0"..., 37) = 37
read(0,
再运行客户端
即可看到结果: read的第一个参数fd=0了
/*
先看TCP服务器端的程序:
*/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define PORT 10000
int main(int argc, char *argv[])
{
int sockfd,new_fd = 0;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size;
int nbytes;
char buffer[1024];
/* 服务器端开始建立sockfd描述符 */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
exit(1);
}
/* 服务器端填充 sockaddr结构 */
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(PORT);
/* 捆绑sockfd描述符到IP地址 */
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
exit(1);
}
/* 设置允许连接的最大客户端数 */
if(listen(sockfd,5)==-1)
{
fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
exit(1);
}
while(1)
{
/* 服务器阻塞,直到客户程序建立连接 */
memset(buffer, '\0', sizeof(buffer));
sin_size=sizeof(struct sockaddr_in);
if(new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size)==-1)
{
fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
exit(1);
}
char IPdes[16]="";
inet_ntop(AF_INET, (void *)&client_addr.sin_addr, IPdes, 16);
fprintf(stderr,"Server get connection from %s\n",IPdes);
if((nbytes=read(new_fd,buffer,1024))==-1)
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
exit(1);
}
buffer[nbytes]='\0';
printf("Server received %s\n",buffer);
}
/* 结束通讯 */
close(sockfd);
exit(0);
}
客户端:
/*
再看客户端的程序:
*/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 10000
int main(int argc, char *argv[])
{
int sockfd;
char buffer[1024] = "hello";
struct sockaddr_in server_addr;
/* 客户程序开始建立 sockfd描述符 */;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(PORT);
inet_pton(AF_INET,"127.0.0.1",&server_addr.sin_addr.s_addr);
again:
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
goto again;
}
if(write(sockfd,buffer,strlen(buffer)) <= 0)
{
goto again;
}
printf("write ok\n");
return 0;
}
先运行tcpserver
再运行:
root@ubuntu:/mnt/hgfs/ubuntu-share/eclipse-work/tcpclient/Debug# ps -ef | grep tcpserver
root 12254 9880 0 21:18 pts/2 00:00:00 ./tcpserver
root 12257 9892 0 21:19 pts/3 00:00:00 grep --color=auto tcpserver
root@ubuntu:/mnt/hgfs/ubuntu-share/eclipse-work/tcpclient/Debug# st
start start-pulseaudio-x11 stat stdbuf strings
startpar start-stop-daemon static-sh stop strip
start-pulseaudio-kde startx status strace stty
root@ubuntu:/mnt/hgfs/ubuntu-share/eclipse-work/tcpclient/Debug# strace -p 12254
Process 12254 attached - interrupt to quit
accept(3, {sa_family=AF_INET, sin_port=htons(46666), sin_addr=inet_addr("127.0.0.1")}, [16]) = 4
write(2, "Server get connection from 127.0"..., 37) = 37
read(0,
再运行客户端
即可看到结果: read的第一个参数fd=0了
相关文章推荐
- 使用strace追踪程序的系统调用
- 使用linux的strace来调试程序系统调用
- strace统计程序系统调用
- Android Camera 使用小结。两种方法:一是调用系统camera app,二是自己写camera程序。
- 使用strace和ltrace跟踪程序调用
- 程序如何使用系统调用?
- 学习笔记 --- LINUX 应用调试之使用strace命令追踪系统调用
- delphi中使用winexec()过程调用系统程序
- 使用strace工具跟踪系统调用和信号
- 使用隐式意图调用系统拨号,呼叫程序
- 如何在程序中使用系统调用
- linux 系统调用分析 使用strace工具
- 使用strace跟踪系统调用
- 利用strace ltrace或truss跟踪程序的系统调用
- 应用调试之使用strace命令跟踪系统调用
- MySQL使用udf调用系统程序
- ls -l |grep "^-"|wc -l 程序问题的定位—strace -p pid(跟踪系统调用)gdb -p pid(调试)lsof -p pid(查看当前进程打开的文件描述符) ps -e
- MySQL使用udf调用系统程序
- 【Android】使用Intent调用系统其它程序,使用onKeyDown对音量键的监听,长按事件
- Android使用系统调用相册的时候打开了云相册出现CRASH或者找不到截图程序的解决方案