c - 如何知道我从哪里启动

标签 c linux linux-kernel kernel

我开发了一个可在多个平台上运行的应用程序,其中启动磁盘是'/dev/nftla1''dev/hdc1'。 Grub 引导加载程序具有此信息。

但是一旦内核接管并且应用程序开始运行,它就变得无关紧要了。但是,在我主要使用 'C' 的应用程序中,我想知道启动源,因为这些平台上访问文件的方式不同。

我的问题是:是否有系统命令或您知道的任何技巧可以帮助我实现目标?

最佳答案

您可以从 grub 传递内核启动选项,然后检查它们。

cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-2.6.32-33-generic root=UUID=3c231d1a-b6cb-4526-95fe-eb8984c7a91a ro quiet splash

More info .

更新: 您可以使用此 C 代码来解析 /proc/cmdline:

#include <stdio.h>                                                                                                                                            
#include <stdlib.h>                                                                                                                                           
#include <string.h>                                                                                                                                           

int parse_option(const char *line, const char *option, char *value, size_t size)                                                                              
{                                                                                                                                                             
    const char *p0, *p1;                                                                                                                                      
    int len;                                                                                                                                                  

    p0 = strstr(line, option);                                                                                                                                
    if (!p0)                                                                                                                                                  
        return 0;                                                                                                                                             
    p0 += strlen(option);                                                                                                                                     
    p1  = strchr(p0, ' ');                                                                                                                                    
    if (!p1)                                                                                                                                                  
       p1 = p0 + strlen(p0);                                                                                                                                  
    len = p1 - p0;                                                                                                                                            
    if (len > size - 1)                                                                                                                                       
        len = size - 1;                                                                                                                                       
    memcpy(value, p0, len);                                                                                                                                   
    value[len] = '\0';                                                                                                                                        
    return len;                                                                                                                                               
}

void get_cmdline_option(const char *option, char *value, size_t size)                                                                                         
{                                                                                                                                                             
    FILE  *fp;                                                                                                                                                
    char  *line = NULL;                                                                                                                                       
    size_t len = 0;                                                                                                                                           
    size_t read;                                                                                                                                              

    if (!size)                                                                                                                                                
        return;                                                                                                                                               
    *value = '\0';                                                                                                                                            
    fp = fopen("/proc/cmdline", "r");                                                                                                                         
    if (fp == NULL)                                                                                                                                           
         return;                                                                                                                                              
    while ((read = getline(&line, &len, fp)) != -1) {                                                                                                         
        printf("%s", line);                                                                                                                                   
        if (parse_option(line, option, value, size))                                                                                                          
            break;                                                                                                                                            
    }                                                                                                                                                         
    fclose(fp);                                                                                                                                           
    if (line)                                                                                                                                                 
        free(line);
    return;                                                                                                                                                   
}                                                                                                                                                             

int main(int argc, char **argv)                                                                                                                               
{                                                                                                                                                             
    char root[128];                                                                                                                                           
    get_cmdline_option("root=", root, sizeof(root));                                                                                                          
    printf("root='%s'\n", root);                                                                                                                              
    return 0;                                                                                                                                                 
}

关于c - 如何知道我从哪里启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10536261/

相关文章:

c++ - 在 Linux 上无法按预期工作的共享库中的增强日志记录 channel 过滤

c - 如何保护 RCU 阅读器部分免于抢占?

c - 在 C 中打印一个非常大的整数

使用 c - printf 将 ieee 754 float 转换为十六进制

Linux 管道(转换 -> pdf2ps -> lp)

Linux用户访问和挂载

assembly - 在 Linux 内核中断处理程序中传递函数参数(从 asm 到 C)

linux - linux调度程序是否需要上下文切换?

c++ - 使用 recvfrom 获取数据

c++ - 梯度和内存