OS:linux
我无法解释以下程序的输出:
#include <stdlib.h>
#include <sys/mount.h>
#include <errno.h>
#include <stdio.h>
*****更新代码*****
void mount_sys() {
if (0 != mount("none", "/sys", "sysfs", 0, ""))
{
/* handle error */
}
}
int
main()
{
int a,b, err;
FILE *file;
err=putenv("PATH=/bin");
printf("putenv return value =%d\n",err);
mount_sys();
;
err=system("echo 47 > /sys/class/gpio/export");
if (err == 0) {
printf("system called good");
} else {
perror("Error");
}
err=system("echo out > /sys/class/gpio/gpio47/direction");
if (err == 0) {
printf("system called good");
} else {
perror("Error");
}
err=system("echo 1 > /sys/class/gpio/gpio47/value");
if (err == 0) {
printf("system called good");
} else {
perror("Error");
}
return 0;
}
输出
Error: Success
Error: Success
Error: Success
如果所有系统调用都成功,我应该有三次system called good
条消息。
但看起来它失败了。但是为什么使用perror()打印的错误是Success ?
答案 0 :(得分:1)
system()返回的值可以是以下两种情况之一:
shell命令的退出状态,或
-1(表示fork()系统调用本身失败)
perror()仅与第二种情况有关。正如其他人所建议的那样,打印出err
的值而不是仅仅依赖于perror()。
----更新--- 返回值包括进程的退出状态(前8位)和杀死进程的信号#(如果有的话,低8位)。 32512 == 127&lt;&lt; 8,所以shell退出代码 是127。
根据这个: 127 Return code from $?
返回代码表示您尝试运行的命令(echo
)不在shell的PATH中
答案 1 :(得分:1)
处理对system()
的调用的正确方法是:
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h> /* For WEXITSTATUS */
int main(void)
{
int result = EXIT_SUCCESS; /* Be optimistic. */
char cmd[] = "mycommand";
int status = system(cmd);
if (-1 == status)
{
perror("system() failed internally");
result = EXIT_FAILURE;
}
else
{
fprintf(stderr, "'%s' returned %d.\n", cmd, WEXITSTATUS(status));
}
return result;
}