无法正确解释c程序中system()的返回值

时间:2014-06-06 12:33:53

标签: c linux

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 ?

2 个答案:

答案 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;
}