2013-10-19 78 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,则可以打开并阅读历史记录文件,然后查找您的应用的出现次数。这将显示调用它的完整命令。其他应用程序可能有类似的历史文件