我正在编写一个 c 程序,它执行一系列 bash shell 命令以获取机器中的处理器数量并相应地分配程序的亲缘关系。这是我的功能:
int getNoOfCPUs()
{
system("sudo nproc | sudo tee /home/sanuri/Desktop/tempnproc.txt");
printf("Created temp file..... \n");
FILE *fr;
fr = fopen ("/home/sanuri/tempnproc.txt", "r");
printf("Opened file..... \n");
printf("%d",errno);
int i=0;
int number[3];
do{
if(fr==NULL){
fr = fopen ("/home/sanuri/tempnproc.txt", "r");
}
number[i] = fgetc(fr);
if( feof(fr) )
{
break ;
}
printf("%c", number[i]);
i++;
}while(1);
if(fr!=NULL){
fclose(fr);
}
return number;
}
我仍然停留在 fopen 上。似乎由于权限问题而无法打开文件。此外,我无法通过此 c 程序运行最有用的命令,因为我必须使用 sudo 来运行它们并且必须提供我的密码才能成功执行命令。我将自己添加到“sudo”组。但是,如果没有 sudo 并提供我的密码,我将无法运行这些命令。这个问题的一般解决方案是什么?我该怎么做才能取消提供密码的要求,这样我就可以在没有 sudo 的情况下通过 c 程序简单地运行命令?如果解决方案足够通用,可以使我的程序可移植到任何 linux 平台,那就更好了。
最佳答案
首先,sudo tee ...
将打开指定的文件,如果它不存在,作为用户 root
,所以你将无法以非 root
用户身份查看文件。
其次,不要在程序中使用 sudo
,您应该使用 sudo
调用程序本身。这样,如果您已经以 root
身份运行它,就不会进行不必要的 sudo
调用。
第三,(至少,在我的 Ubuntu 14.04 机器上),运行 nproc
似乎首先不需要 sudo
。
最后,由于您使用的是 Linux,您最好使用 popen
来捕获 nproc
的输出,而不是将其通过管道传输到文件。
此外,您没有检查第二次 fopen
调用的结果,这很可能会导致段错误。
关于c - c程序中的sudo权限问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25081063/