2013-02-20 111 views
2

我有一個'C'可執行文件c_out,它可以從兩個不同的腳本scriptA和scriptB執行。有沒有一種方法可以在c_out中找到哪個腳本執行了我?沒有任何參數傳遞給c_out,但我想知道誰執行了c_out。從我的可執行文件調用

+0

不是直接。如果你可以改變一些東西,也許你可以做你想做的事情:包括命令行參數('c_out scriptB')或使用環境變量... – pmg 2013-02-20 23:33:25

+0

你有一些合理的(如果是Linux的)答案,但一個更深的問題是:爲什麼你的可執行文件關心?我懷疑設計是否有缺陷,如果它必須根據哪個腳本調用它來做不同的事情。 scriptC執行它時會發生什麼? – 2013-02-21 00:41:00

回答

3

下面是在Linux上確定這一點的快速方法。

#include <stdio.h> 

int main(int argc, char* argv[]) 
{ 
     int ppid = 0; 
     char syscmd[32]; 
     ppid = getppid(); 
     sprintf(syscmd,"cat /proc/%d/cmdline\n",ppid); 
     system(syscmd); 
     return 0; 
} 

+0

這值得一些解釋...然而, – CharlesB 2013-02-21 00:15:47

+0

打開文件(在/ proc下)並且讀取它會很容易;可能比使用'system'更有用。 – 2013-02-21 00:35:21

+0

@CharlesB假設是該過程可以得到其父項PID並從中派生出一個名稱/ cmdline。這不是100%,但可以在大多數情況下使用。可能有更好的解決方案。 – 2013-02-21 01:36:57

0

閱讀/proc/../cmdline僅適用,如果腳本運行它自己的bash進程。

如果它包含在source script中,它將打印調用腳本/ shell。

實際腳本存儲在bash變量BASH_SOURCE中。

從c程序中讀取並不是那麼容易,但可以使用gdb來完成。

例如,在AMD64這始終打印(甚至是採購的)調用腳本:

#include <stdio.h> 

int main(int argc, char* argv[]) 
{ 
    int ppid = 0; 
    char syscmd[256]; 
    ppid = getppid(); 
    sprintf(syscmd,"gdb --batch -ex \"attach %d\" -ex 'print *(*((*((char****)find_variable(\"BASH_SOURCE\") + 1) + 8) + 2) + 1)'\n",ppid); 
    system(syscmd); 
    return 0; 
} 
+0

由於它是一個正在執行的C可執行文件,因此沒有被點擊或來源的危險,是嗎? – 2013-02-21 00:33:54

+0

@JonathanLeffler調用可執行文件的腳本可能已經被找到。例如。當'script'調用程序並在bash提示符中鍵入'source script'時 – BeniBela 2013-02-21 00:35:23

+0

我想你是對的,是技術性的;儘管我願意爭辯說,源自腳本的命令是執行腳本的命令,而不管它是否在源腳本中執行。除了設置環境變量以外,你多長時間採購一個腳本?我知道我基本上從不使用'source'(完全可以,但是我使用'.'來代替),除了設置環境。 YMMV,我猜。 – 2013-02-21 00:38:53

0

你可以嘗試找出你的父進程的可執行文件的路徑,但不是因爲父母的可靠解決方案進程可能會在子進程之前終止,然後您的C進程將被轉移到* nixes中的init。或者父母可能會使用exec替代孩子,然後就沒有可靠的方法來找到它。

根據你試圖解決什麼問題,最簡潔的方式可能是改變你的C程序的行爲不同,而不是取決於誰在執行它,而是在environment或命令行參數。

相關問題