我正在编写一个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平台,那就更好了。
答案 0 :(得分:2)
首先,sudo tee ...
将以用户root
打开指定文件(如果它不存在),因此您无法将该文件视为非 - root
用户。
其次,不要在程序中使用sudo
,而应使用sudo
调用程序本身。这样,如果您已经将其作为root
运行,那么您将无法进行不必要的sudo
来电。
第三,(至少在我的Ubuntu 14.04计算机上),似乎首先运行nproc
并不需要sudo
。
最后,由于您使用的是Linux,因此最好使用popen
来捕获nproc
的输出,而不是将其传输到文件中。
此外,您不会检查第二次fopen
来电的结果,这可能会导致段错误。