我有一個'C'可執行文件c_out,它可以從兩個不同的腳本scriptA和scriptB執行。有沒有一種方法可以在c_out中找到哪個腳本執行了我?沒有任何參數傳遞給c_out,但我想知道誰執行了c_out。從我的可執行文件調用
回答
下面是在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;
}
〜
這值得一些解釋...然而, – CharlesB 2013-02-21 00:15:47
打開文件(在/ proc下)並且讀取它會很容易;可能比使用'system'更有用。 – 2013-02-21 00:35:21
@CharlesB假設是該過程可以得到其父項PID並從中派生出一個名稱/ cmdline。這不是100%,但可以在大多數情況下使用。可能有更好的解決方案。 – 2013-02-21 01:36:57
閱讀/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;
}
由於它是一個正在執行的C可執行文件,因此沒有被點擊或來源的危險,是嗎? – 2013-02-21 00:33:54
@JonathanLeffler調用可執行文件的腳本可能已經被找到。例如。當'script'調用程序並在bash提示符中鍵入'source script'時 – BeniBela 2013-02-21 00:35:23
我想你是對的,是技術性的;儘管我願意爭辯說,源自腳本的命令是執行腳本的命令,而不管它是否在源腳本中執行。除了設置環境變量以外,你多長時間採購一個腳本?我知道我基本上從不使用'source'(完全可以,但是我使用'.'來代替),除了設置環境。 YMMV,我猜。 – 2013-02-21 00:38:53
你可以嘗試找出你的父進程的可執行文件的路徑,但不是因爲父母的可靠解決方案進程可能會在子進程之前終止,然後您的C進程將被轉移到* nixes中的init
。或者父母可能會使用exec
替代孩子,然後就沒有可靠的方法來找到它。
根據你試圖解決什麼問題,最簡潔的方式可能是改變你的C程序的行爲不同,而不是取決於誰在執行它,而是在environment或命令行參數。
- 1. 從JSP調用可執行文件
- 2. 從PHP調用MATLAB可執行文件
- 3. 從JAVA調用C++可執行文件
- 4. 無法從extensionscript .jsx文件調用可執行文件
- 5. strace'open'調用可執行文件庫
- 6. 從Linux可執行文件
- 7. 執行可執行一個bat文件後,從我的批處理文件
- 8. 從C#調用Fortran可執行文件的進程
- 9. 使用gdb從腳本啓動的可執行文件調試
- 10. 從OS X上的NPAPI調用外部可執行文件?
- 11. 生成從可執行文件調用的C++方法列表
- 12. 如何從我的庫中調用可執行文件中的函數?
- 13. 從ColdFusion應用程序調用Windows可執行文件(.exe)
- 14. 如何從C程序(使用winapi)調用可執行文件?
- 15. 如何使用javascript執行從Linux的可執行文件
- 16. 從MATLAB函數調用可執行文件,死機處理
- 17. 如何從路徑調用可執行文件?
- 18. 無法從C++程序調用可執行文件
- 19. Erlang:從beam可執行文件中調用rr(?MODULE)?
- 20. 如何從Android調用lame可執行文件?
- 21. 從powershell腳本調用可執行文件(帶參數)
- 22. 從Python中調用DOS可執行文件
- 23. 如何從Python腳本調用可執行文件?
- 24. 替代從Java調用平可執行文件在Android
- 25. 我們如何可以調用CLI可執行文件的命令使用Python
- 26. 什麼可執行文件啓動了我的可執行文件?
- 27. 從可執行文件調用的C#程序集中訪問App.Config文件
- 28. 從Matlab運行C可執行文件
- 29. 從SQL Server運行可執行文件
- 30. 從makefile運行可執行文件
不是直接。如果你可以改變一些東西,也許你可以做你想做的事情:包括命令行參數('c_out scriptB')或使用環境變量... – pmg 2013-02-20 23:33:25
你有一些合理的(如果是Linux的)答案,但一個更深的問題是:爲什麼你的可執行文件關心?我懷疑設計是否有缺陷,如果它必須根據哪個腳本調用它來做不同的事情。 scriptC執行它時會發生什麼? – 2013-02-21 00:41:00