linux 进程参数文件 /proc/pid/cmdline

一:简介
在proc根目录下,以数字命名的目录表示当前一个运行的进程,目录名为进程的pid。其内的目录和文件给出了一些关于进程的信息,可以看到如下所示文件:
linux 进程参数文件 /proc/pid/cmdline_第1张图片
其中attr、fd、fdinfo、task为目录,cwd、root为指向目录的链接,exe为指向文件的链接,其余为一般文件。对于一些文件或目录的权限(查看或者修改的权限)是该进程的创建者才有,例如auxv等文件或目录只有创建该进程的用户才有查看或修改的权限,而其他一些文件则对所有用户可读权限。
关于这些目录和文件的权限,结构体如下所示

static const struct    pid_entry    tid_base_stuff[] = {
    DIR("fd", S_IRUSR|S_IXUSR, proc_fd_inode_operations, proc_fd_operations),
    DIR("fdinfo", S_IRUSR|S_IXUSR, proc_fdinfo_inode_operations, proc_fdinfo_operations),
    REG("environ", S_IRUSR, proc_environ_operations),
    INF("auxv", S_IRUSR, proc_pid_auxv),
    ONE("status", S_IRUGO, proc_pid_status),
    ONE("personality", S_IRUSR, proc_pid_personality),
    INF("limits", S_IRUSR, proc_pid_limits),
#ifdef    CONFIG_SCHED_DEBUG
    REG("sched", S_IRUGO|S_IWUSR, proc_pid_sched_operations),
#endif
    REG("comm", S_IRUGO|S_IWUSR, proc_pid_set_comm_operations),
#ifdef    CONFIG_HAVE_ARCH_TRACEHOOK
    INF("syscall", S_IRUSR, proc_pid_syscall),
#endif
    INF("cmdline", S_IRUGO, proc_pid_cmdline),
    ONE("stat", S_IRUGO, proc_tid_stat),
    ONE("statm", S_IRUGO, proc_pid_statm),
    REG("maps", S_IRUGO, proc_maps_operations),
#ifdef    CONFIG_NUMA
    REG("numa_maps", S_IRUGO, proc_numa_maps_operations),
#endif
    REG("mem", S_IRUSR|S_IWUSR, proc_mem_operations),
    LNK("cwd", proc_cwd_link),
    LNK("root", proc_root_link),
    LNK("exe", proc_exe_link),
    REG("mounts", S_IRUGO, proc_mounts_operations),
    REG("mountinfo", S_IRUGO, proc_mountinfo_operations),
#ifdef    CONFIG_PROC_PAGE_MONITOR
    REG("clear_refs", S_IWUSR, proc_clear_refs_operations),
    REG("smaps", S_IRUGO, proc_smaps_operations),
    REG("pagemap", S_IRUSR, proc_pagemap_operations),
#endif
#ifdef    CONFIG_SECURITY
    DIR("attr", S_IRUGO|S_IXUGO, proc_attr_dir_inode_operations, proc_attr_dir_operations),
#endif
#ifdef    CONFIG_KALLSYMS
    INF("wchan", S_IRUGO, proc_pid_wchan),
#endif
#ifdef    CONFIG_STACKTRACE
    ONE("stack", S_IRUSR, proc_pid_stack),
#endif
#ifdef    CONFIG_SCHEDSTATS
    INF("schedstat", S_IRUGO, proc_pid_schedstat),
#endif
#ifdef    CONFIG_LATENCYTOP
    REG("latency", S_IRUGO, proc_lstats_operations),
#endif
#ifdef    CONFIG_PROC_PID_CPUSET
    REG("cpuset", S_IRUGO, proc_cpuset_operations),
#endif
#ifdef    CONFIG_CGROUPS
    REG("cgroup", S_IRUGO, proc_cgroup_operations),
#endif
    INF("oom_score", S_IRUGO, proc_oom_score),
    REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adjust_operations),
#ifdef    CONFIG_AUDITSYSCALL
    REG("loginuid", S_IWUSR|S_IRUGO, proc_loginuid_operations),
    REG("sessionid", S_IRUSR, proc_sessionid_operations),
#endif
#ifdef    CONFIG_FAULT_INJECTION
    REG("make-it-fail", S_IRUGO|S_IWUSR, proc_fault_inject_operations),
#endif
#ifdef    CONFIG_TASK_IO_ACCOUNTING
    INF("io", S_IRUGO, proc_tid_io_accounting),
#endif
};

二:cmdline文件
该文件包含的是该进程的命令行参数,包括进程的启动路径(argv[0])
事例:
1,编写hello.c

#include 
#include 
 
int main()
{
    int i=0;
    for(i=0;i<100;i++)
    {
        printf("hello world\n");
        sleep(2);
    }
    return 0;
}

2,编译运行并找到该程序的进程号:
linux 进程参数文件 /proc/pid/cmdline_第2张图片3,进入到/proc/9888进程里面,cat一下cmdline,如下所示
在这里插入图片描述
可以看到cmdline里的内容为 “./helloonetwo”,正是命令行的参数,可能你会疑问为什么参数没有分开??那是因为cat欺骗了你。我们可以将cmdline复制到desktop下,然后用vim查看发现是这样的:

./hello^@one^@two^@

4,可以将里面的字符一个一个打印出来:

#include // std io fopen() snprintf() feof() perrof()
int main(int argc,char *argv[])
{
    FILE *fp;
    char path[80];
    unsigned char ch;
    snprintf(path,80,"/home/lijun/desktop/cmdline");//将cmdline中内容写入path数组中,并在path的结尾添 加字符结束符"\0"
    if((fp=fopen(path,"r")) == NULL)
    {
        perror("fopen");
        return 0;
    }
    while(!feof(fp)) //判断当前操作位置是否为文件的末尾,如果是,返回一个非零值
    {
        ch=fgetc(fp);//从stream流中读取一个字符,操作位置向下移动一个
        printf("%c %d\n",ch,ch);
    }
    fclose(fp);
    return 0;
}

编译运行如下:
linux 进程参数文件 /proc/pid/cmdline_第3张图片
我们可以看到并非是每个参数之间没有间隔,而是以字符"\0"作为间隔。所以如果我们在某一个程序中想读取进程的命令行参数,我们只需要知道该进程的pid,然后进入proc文件系统的该pid对应的目录下,编程读写读取cmdline文件就可以了。

你可能感兴趣的:(Linux,linux,perl,ssh)