2013-10-19 80 views
0

我正在寫一個C程序,它決定從標準輸入讀取的字節數。我 發現有辦法讓輸入到程序linux找到調用的命令

  • 管道輸入
  • 重定向
  • 進入命令行,而程序正在等待輸入

如何找到確切從shell執行程序的命令。 我嘗試使用命令行參數,但失敗。

#include <stdio.h> 

int main(int argc,char *argv[]) 
{ 
     char buffer[100]; 
     int n; 

     for(n=1;n<argc;n++) 
       printf("argument: %s\t",argv[n]); 

     printf("\n"); 
     if(argc==1) 
       printf("waiting for input :"); 
     else if (argc==3) 
       printf("Not waiting for input . Got the source from command itself ."); 

     n = read(0,buffer,100); 
     if(n==-1) 
       printf("\nError occured in reading"); 
     printf("\nReading successfully done\n"); 

     return 0; 
} 

此外,

+0

你忘了在'read'之前調用fflush' –

+0

目前還不清楚你是否要計算你的程序或其他程序讀取的字節數...... –

回答

1

一般情況下,你不能這樣做,從你的程序中 - 殼可能不是沿着其中的一些參數來傳遞。在您的程序運行或獲取參數之前,它將擴展全局,完成I/O重定向等操作。

您可以嘗試撥打ps -o args,這可能會爲您解決。不過,據我所知,它不會給出重定向。

0

你有一些選擇,檢查的argv,看看它是如何調用(的argv [0]告訴它基於前面的/ s的.S或缺乏是否被援引爲完整路徑,相對路徑,當前目錄或使用$ PATH物)

你可以得到的東西,如調用它的父進程:

sprintf(buf,"/proc/%d/cmdline",getppid()); 
fd=open(buf,O_RDONLY); 
read(fd,buf,buf_size); 
write(1,buf,strlen(buf)); 

還可以得到其他的信息從/ proc/PID/......對於如上使用GETPID當前命令(不getppid)

一旦你得到父進程,你馬你能夠採取更多行動。例如,如果父項的基名是sh,或者bash,則可以打開並閱讀歷史記錄文件,然後查找您的應用的出現次數。這將顯示調用它的完整命令。其他應用程序可能有類似的歷史文件