在C

时间:2019-05-05 04:18:47

标签: c linux bin

在C程序中从/usr/bin目录运行程序的最有效方法是什么?我的任务是获取用户输入,如果用户输入与bin中的程序匹配,则运行相应的程序。

我的想法是将所有bin程序的名称放入一个文本文件中,并使用循环遍历文件中的每个单词,同时将该单词与输入进行比较。但是,我认为这可能会重新发明轮子。有没有简化的方法可以做到这一点?

2 个答案:

答案 0 :(得分:3)

从任何类似UNIX的操作系统上的现有进程中调用程序的“经典”方式是使用exec() functions中的一种。当您读到有关import sklearn import networkx as nx import matplotlib.pyplot as plt '''Graph creation and initialization''' G=nx.Graph() G.add_edge(1,2) # default edge weight=1 G.add_edge(3,4,weight=0.2) #weight represents edge weight or affinity G.add_edge(2,3,weight=0.9) G.add_edge("Hello", "World", weight= 0.6) '''Matrix creation''' adj_matrix = nx.to_numpy_matrix(G) #Converts graph to an adj matrix with adj_matrix[i][j] represents weight between node i,j. node_list = list(G.nodes()) #returns a list of nodes with index mapping with the a '''Spectral Clustering''' clusters = SpectralClustering(affinity = 'precomputed', assign_labels="discretize",random_state=0,n_clusters=2).fit_predict(adj_matrix) plt.scatter(nodes_list,clusters,c=clusters, s=50, cmap='viridis') plt.show() 的内容时,大多数教程都将从解释另一个功能:exec()开始。这些功能非常经常一起使用,但是不要太着急,因为它们本身都非常有用。

要回答您的问题,这是一种相当有效的方法:

  1. 从您碰巧的来源获取用户生成的输入
  2. (或致电fork()
  3. 调用fork()函数
  4. 您在此处执行的操作将取决于您是否在步骤(2)中调用了execvp(),以及在执行您描述的任务之后打算做什么(如果有的话)。

execvp()将通过自动在您的环境PATH中搜索与第一个参数匹配的文件名来帮您完成工作。如果当前环境未设置PATH,它将默认为fork()。因为对/bin:/usr/bin的调用可以产生返回值的唯一方法是该调用失败,所以您可能要在步骤(4)中检查exec()的值。如果用户输入与环境PATH中的任何可执行文件都不匹配,则errno将设置为errno。确切的操作方式以及值得采取的其他步骤将取决于您是否分叉以及程序的其他要求。

答案 1 :(得分:-1)

我建议您查看从用户那里获得的名称是否与/usr/bin目录中的文件匹配,以及是否确实使用system函数来运行该程序。

https://linux.die.net/man/3/system

#include <stdlib.h>
int system(const char *command);

FILE *file;
if (file = fopen(userinput, "r")){
    fclose(file);
    system(userinput);
}