百科问答小站 logo
百科问答小站 font logo



在 linux 中,用 c 语言如何判断 yum 源是否配置好? 第1页

  

user avatar   zorrolang 网友的相关建议: 
      

你这里面有两个问题:

  1. 怎么判断当前系统的yum源是否都能正常访问。
  2. 怎么用C语言做到这个检查。

关于问题1,首先yum没有直接用于检查所有使能的repo是否能正常访问的方法,所以需要一些别的方法来辅助判断。这样方式就有很多,比如yum update,yum list等方式会尝试先load所有repo源,进而检查这些repo是否正常。但是有些repo设置中,或全局设置中可能设置了诸如skip_if_unavailable的变量,达到如果repo不可用则直接跳过(不返回错误)的效果。可见这不是我们想要的,我们想要的是在发现不可用的repo时就返回错误。所以我们最好手动设置skip_if_unavailable=false,比如这样:

       # yum --setopt=skip_if_unavailable=false list bash     

当然,因为yum list会尝试list出所有软件包,但是我们其实不是想列出软件包,而只是想借助其list packages之前做的load repos的工作,所以我只让它列出一个最常见的软件包,如bash (换别的也可以),来减少运行时间。

我故意将系统其中一个repo地址改为一个无效地址,执行结果如下:

       # yum --setopt=skip_if_unavailable=false list bash ...                                                                                                                                             70  B/s | 168  B     00:02 Errors during downloading metadata for repository 'xxxx':   - Status code: 404 for http://xxx/xxxxxxx/xxxxx Error: Failed to download metadata for repo 'xxxx': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried # echo $? 1     

现在第一个问题我们找到了一个差不多可行的方法(当然不排除有更合适的)。然后下面就是第二个问题。怎么用C语言来做这个检查?

一种方式是用C语言读取yum repo的配置文件,获取各个url,解析url,进而通过http/ftp等协议访问各个地址,尝试判断。这种方式显然比较原始,且有些复杂。

还有一种方式就是让C语言直接执行我们上面列出的命令。好在我们有一个可用的函数叫system(),可以让我们在C语言中执行一个shell命令,并且还能返回这个命令的执行结果,例子如下:

       // mytest.c #include <stdlib.h> #include <stdio.h>  int main(int argc, char *argv[]) {         int ret;          ret = system("yum --setopt=skip_if_unavailable=false list bash");         printf("ret=%d
", ret);         return ret>>8; }     

这就比第一种方式简单多了,第一种方式的很多细节直接交给yum程序去做了,省下很多事。执行效果如下:

       # gcc -o mytest mytest.c -Wall # ./mytest  ...                                                                                                                                             70  B/s | 168  B     00:02 Errors during downloading metadata for repository 'xxxx':   - Status code: 404 for http://xxx/xxxxxxx/xxxxx Error: Failed to download metadata for repo 'xxxx': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried ret=256 # echo $? 1     

当然,如果你嫌yum的输出很讨厌,还可以把输出过滤掉(如果结尾加上 >/dev/null 2>&1)。

我上面只是提供了一种解决问题的思路,并非“标准答案”。问题能否更好的解决有时还需要从问题本身分析入手,比如你面对的需求是否一定要以“用C语言判断yum源是否配好”来解决,是否有更好的设计,等等。这个问题我就写到这里,进一步的分析就是留给做项目的人自己需要承担的责任了。




  

相关话题

  计算机专业大一寒假该如何规划? 
  如何看待 Apple Mac 将无法支持最新微软 Windows 11 操作系统? 
  如何看待法国物理学家对量子计算的强烈批评? 
  为什么计算机采用补码而不是原码或反码? 
  能否给Nokia手机直接编程? 
  如何看待 Windows XP 源代码泄露?XP 源代码首次被公开曝光会产生哪些影响? 
  什么是虚拟寄存器,有何作用? 
  为什么 Python(或 Ruby、Perl 等)没有取代 Bash 成为系统 Shell? 
  有哪些结合医学、计算机、人工智能的研究领域? 
  我们高中数学为什么不重视算法?高中学的数列,三角函数,求导,圆锥曲线相关问题的解法和算法有什么关系? 

前一个讨论
我想买五菱宏光MINIEV,但父母说那种车不安全,我该怎么说服他们?
下一个讨论
如何看待微软承认签名了恶意驱动程序"Netfilter"?





© 2025-03-25 - tinynew.org. All Rights Reserved.
© 2025-03-25 - tinynew.org. 保留所有权利