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

来源:互联网 发布:网络硬盘录像机多少钱 编辑:程序博客网 时间:2024/05/29 18:10

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; // 参数个数 最大设为了10char 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 whilereturn 0;}
编译运行:


直接使用strace 命令


程序运行后 会停在read处 等待输入

在输入 ls  /home/ding 后执行相应的命令


使用strace -f ./test 可以跟踪由fork调用所产生的子进程 



可以看到整个程序的运行过程 以及

open read access write等系统函数的调用


学习参考:

strace的使用  http://blog.csdn.net/qq_26437925/article/details/49532921

execlp实例讲解:http://bubuko.com/infodetail-376404.html


0 0
原创粉丝点击