linux找到调用的命令

时间:2013-10-19 03:26:07

标签: c linux shell

我正在编写一个C程序,它确定从标准输入读取的字节数。一世 发现有方法可以为程序提供输入

  • 管道输入
  • 重定向
  • 在程序等待输入时进入命令行

如何从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;
}

另外,

2 个答案:

答案 0 :(得分:1)

一般情况下,你不能在你的程序中执行此操作 - shell可能不会将一些参数传递给你。在你的程序运行或获得参数之前,它将有扩展的全局,完成I / O重定向等等。

您可以尝试呼叫ps -o args,这可能会对您有所帮助。据我所知,它不会给出重定向。

答案 1 :(得分:0)

你有一些选项,检查argv以查看它是如何被调用的(argv [0]告诉它是否被调用为完整路径,相对路径,当前目录或使用$ PATH基于先前/ s .s或缺少它)

您可以使用以下内容获取调用它的父进程:

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

你也可以使用上面的getpid从/ proc / pid / ...获取当前命令的其他信息(不是getppid)

获得父进程后,您可以采取更多操作。例如,如果父级的基本名称为sh或bash,则可以打开并读取历史记录文件,然后查找应用程序的出现位置。这将显示调用它的完整命令。其他应用程序可能具有类似的历史文件。