2012-03-21 12 views
0

プロセスから呼び出された他のプロセスからの呼び出しを傍受する方法を教えてください。 (例えば、私はmakeを呼び出し、makeからgccへの呼び出しを傍受して変更したいと思っています)。OS-X Linuxインターセプトプロセスコール

+0

* OS-X Linuxインターセプトプロセスコール* OSXまたはLinux?一つを選ぶ。 – cnicutar

答えて

1

を呼び出すよりも何かをエコーし​​ますがptraceの小さな例です。

#include <unistd.h> 
#include <sys/ptrace.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdio.h> 
#include <sys/user.h> 
#include <sys/prctl.h> 

const char *sys_call_name(long num); 

int main() 
{ 
    pid_t pid = fork(); 
    struct user_regs_struct regs; 
    if (!pid) { 
    /* child */ 
    while (1) { printf("C\n"); sleep(1); } 
    } 
    else { /* parent */ 
    int status = 0; 
    ptrace(PTRACE_ATTACH, pid, NULL, 0); 
    ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_SYSCALL) ; 
    while (1) { 
     printf("waiting\n"); 
     pid = wait(&status); 
     /* child gone */ 
     //if (WIFEXITED(status)) { break; } 
     ptrace(PTRACE_GETREGS, pid, 0, &regs); 
     /* regs.orig_eax is the system call number */ 
     printf("A system call: %d : %s\n", regs.orig_eax, sys_call_name(regs.orig_eax)); 
     /* let child continue */ 
     ptrace(PTRACE_SYSCALL, pid, NULL, 0); 
    } 
    } 
    return 0; 
} 


const char *sys_call_name(long num) { 
    switch(num) { 
    case 4: return "write"; 
    case 162: return "nanosleep"; 
    case 165: return "getresuid"; 
    case 174: return "rt_sigaction"; 
    case 175: return "rt_sigprocmask"; 
    default: return "unknown"; 
    } 
} 
0

あなたは簡単にはありません。問題の施設はptrace機能であり、心の弱いものではありません。

1

あなたの質問から、Makefileのヘルプを探していると聞こえます。具体的には、cコンパイラのすべての呼び出しのために何かをしたいと思っています。

makeは、コマンドをローカルで再定義することができます.gccのマクロを再定義するだけで、CCマクロを再定義するだけで済みます。

は、コマンドからのような、

make CC=echo 

ようechoからgccからすべてのコールの代わり(非常に有用ではありませんが、しかし、あなたのアイデアを得る)ことになることを行うことができます。 それとも、

CC=echo 
    testprogram: testprogram.o 

のような行を追加することにより、Makefileの中でそれを行うことができますし、make testprogramを行う際にmakeが、むしろここでのgcc

関連する問題