红联Linux门户
Linux帮助

linux系统调用分析 使用strace工具

发布时间:2016-07-16 10:02:12来源:linux网站作者:master-dragon
test.c:
#include <stdio.h>  
#include <string.h>  
#include <unistd.h>  
#include <stdlib.h>
//using namespace std;
#define MAX_PARA_NUMS  10  
#define MAX_CHAR_EACH_PARA 256
/** 
把带空格的input字符串 分割成几个不带空格的字符串 
例如: 
input = "ls /homg/ding" 
那么 
output[0] = "ls"  
output[1] = "/home/ding"
函数返回output的数量 
*/  
int split(char* input, char output[MAX_PARA_NUMS][MAX_CHAR_EACH_PARA])  
{  
int counter = 0;
int len = strlen(input);  
int flag = 0 ;  
int i, j = 0 ;  
for(i = 0; i < len; i++)  
{  
if(input[i] == ' ') //当前字符是空格时,flag设为0 保存当前的字符串  
{  
if(j != 0 && counter > 0)  
{  
output[counter - 1][j] = '\0';  
}  
flag = 0;  
}  
else  
{  
if(flag == 0) // 新的字符串开始 bTemp设为 1  
{  
j = 0;  
counter++;  
flag = 1;  
}
output[counter - 1][j] = input[i]; // 仍然是上一个str  
j++;  
}  
return counter;   
}
char cmd[MAX_CHAR_EACH_PARA] ; //输入的命令  
int counter = 0; // 参数个数 最大设为了10  
char params[MAX_PARA_NUMS][MAX_CHAR_EACH_PARA]; // 接收一个一个的参数
int main()  
{  
int ret = 0 ;
printf("Hello world, this is Linux!") ;
while(1)  
{  
printf(">");  
fgets(cmd,256,stdin) ;  
if (cmd[strlen(cmd) - 1] == '\n')  
{  
cmd[strlen(cmd) - 1] = '\0';  
}
if(fork() == 0)  
{  
//execlp(cmd,NULL);  
counter = split(cmd, params);  
if(counter != 0)  
{  
//printf("counter = %d\n" , counter);  
switch(counter)  
{  
case 0: break;  
case 1:   
{  
execlp(params[0], params[0], NULL);  
}  
break;  
case 2:  
{  
//printf("%s %s\n" ,params[0] ,params[1] );  
execlp(params[0], params[0] , params[1], NULL);  
}  
break;  
case 3:  
{  
execlp(params[0], params[0], params[1], params[2],  
(char*)0);  
}  
break;  
case 4:  
{  
execlp(params[0], params[0], params[1], params[2],   
params[3], (char*)0);  
}  
break;  
case 5:  
{  
execlp(params[0], params[0], params[1], params[2],   
params[3], params[4], (char*)0);  
}  
break;  
case 6:  
{  
execlp(params[0], params[0], params[1], params[2],   
params[3], params[4], params[5], (char*)0);  
}  
break;  
case 7:  
{  
execlp(params[0], params[0], params[1], params[2],   
params[3], params[4], params[5], params[6], (char*)0);  
}  
break;  
case 8:  
{  
execlp(params[0], params[0], params[1], params[2],   
params[3], params[4], params[5], params[6],  
params[7], (char*)0);  
}  
break;  
case 9:  
{  
execlp(params[0], params[0], params[1], params[2],   
params[3], params[4], params[5], params[6],  
params[7], params[8], (char*)0);  
}  
break;  
case 10:  
{  
execlp(params[0], params[0], params[1], params[2],   
params[3], params[4], params[5], params[6],  
params[7], params[8], params[9], (char*)0);  
}  
break;  
default:  
{  
printf("Illegal Input!\n");  
}  
} // end switch  
}  
}else{  
wait(&ret);  
printf("child process return %d\n",ret);  
}   
} // end while  
return 0;  
}  
 
编译运行:
linux系统调用分析 使用strace工具
直接使用strace 命令
linux系统调用分析 使用strace工具
程序运行后会停在read处,等待输入
在输入 ls /home/ding 后执行相应的命令
linux系统调用分析 使用strace工具
使用strace -f ./test 可以跟踪由fork调用所产生的子进程 
linux系统调用分析 使用strace工具
linux系统调用分析 使用strace工具
可以看到整个程序的运行过程以及open read access write等系统函数的调用。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/22414.html