unix 获取在C中使用的shell

x33g5p2x  于 2022-11-04  发布在  Unix
关注(0)|答案(1)|浏览(157)

我正在尝试获取正在使用的shell(执行代码的位置)。
例如,如果二进制文件名为tmp
当我在bash shell上执行./tmp时,我得到一个bash printf,但如果在zsh shell上执行,我得到的printf是zsh
我目前尝试


# include <stdio.h>

# include <stdlib.h>

# include <string.h>

int main()
{
    char command[50];
    strcpy( command, "echo $0" );
    system(command);
    return 0;
}

但是我得到的唯一输出是sh,这不是我想要的输出。

hmmo2u0o

hmmo2u0o1#

如果您要尝试回答“当前命令的父命令是什么”这个问题,则需要:
1.获取父进程的进程ID,然后
1.找出该pid的命令名
但是如果你想回答这个问题,“什么shell被配置为当前用户的默认shell”,那就是另一个问题了。
获取您的父PID很容易;只需使用getppid()函数:

pid_t parent_pid;
parent_pid = getppid();

获取与该pid关联的命令很简单,但需要多几个步骤。最简单的解决方案可能是从/proc/<pid>/comm中阅读值,这意味着:

  • 根据parent_pid变量计算路径名
  • 开启档案
  • 将内容读入缓冲区

也许是这样的:


# include <stdio.h>

# include <stdlib.h>

# include <string.h>

# include <unistd.h>

# include <fcntl.h>

# ifndef BUFSIZ

# define BUFSIZ 8192

# endif

int main()
{
    char path[BUFSIZ], comm[BUFSIZ];
    pid_t parent_pid = getppid();
    int fd;

    // compute the pathname
    if (snprintf(path, BUFSIZ, "/proc/%d/comm", parent_pid) > BUFSIZ) {
        fprintf(stderr, "path too long\n");
        exit(1);
    }

    // open the file
    if (-1 == (fd = open(path, O_RDONLY))) {
        fprintf(stderr, "failed to open comm file\n");
        exit(1);
    }

    // read the contents into the `comm` variable
    memset(comm, 0, BUFSIZ);
    if (-1 == read(fd, comm, BUFSIZ-1)) {
        perror("read");
        exit(1);
    }

    printf("launched from: %s\n", comm);

    if (-1 == close(fd)) {
        perror("close");
        exit(1);
    }
    return 0;
}

bash shell启动,我们可以看到:

bash$ ./getparent
bash

tclsh推出我们看到:

bash$ tclsh
% ./getparent
launched from: tclsh

或者来自Python:

bash$ python
>>> print(subprocess.check_output('./getparent').decode())
launched from: python

所以看起来像广告上说的那样有效。

相关问题