【问题标题】:Why does code work on Solaris but not on Linux?为什么代码可以在 Solaris 上运行,但不能在 Linux 上运行?
【发布时间】:2013-08-16 12:15:54
【问题描述】:

我有一个 C 代码,它在 Solaris 机器上运行良好,但相同的代码有时会出现分段错误,有时会产生不同的输出。

以下是我在两台机器上有所不同的部分:

FILE *inf;
unsigned char *ptr;
unsigned short *ds;
int n, s; 
char work[100];

inf = (FILE *) fopen("Filename", "r");  
s = fseek(inf, 0, SEEK_SET);
n = fread(work, 1, sizeof(work), inf);
ptr = (unsigned char *)work;
ptr += 8;

count = 0;
ds = (unsigned short *) ptr;
count = *ds;

当我打印计数值时,15 in Solaris Machine 和 768 in Linux machine。

请建议我在 Linux 机器上对代码进行的更改。

【问题讨论】:

  • Solaris 机器的字节序是什么?
  • fopen()的返回值不用强制转换,不要那样做。此外,您当然应该在依赖结果之前检查所有 I/O 调用是否成功。
  • 打开读取的文件位于文件的开头。 fseek() 是多余的 - 但它是如此多余,以至于它不是您问题的一个因素。我假设尽管没有错误检查,fopen()(特别是)失败没有问题。
  • 您是否对每台机器上读入work 的值进行了逐字节转储?每台机器都一样吗?你检查n 的值了吗?您的代码要求读取最多 100 个大小为 1 的单位,因此您可以获得短读取 (n < 100)。写入文件的数据结构是什么?它是如何写在 SPARC (Solaris) 机器上的?您使用 8 的偏移量;你确定这是正确的吗?文件是在 Solaris 上写入并在 Linux 上读取,还是在 Solaris 上写入和读取正常,但在 Linux 上写入然后读取时失败?
  • 无论问题的细节如何,您都应该致力于提供与平台无关的代码——因此相同的源代码可以在 Linux(Intel,little-endian)和 Solaris(SPARC,big-endian)上运行.这是完全可行的;它只需要一些照顾。因此,您的“Linux 上代码更改”评论让我担心;您应该寻求“更改代码以使其在 Linux 和 Solaris 上都可以工作”。

标签: c linux solaris


【解决方案1】:

我不认为这是(只是)字节序。 15 = 0x000F。 768 = 0x0300。不过,它可能与 char 的大小有关。尝试在两台机器上打印 CHAR_BIT,看看会得到什么。

【讨论】:

  • 无论平台sizeof(char) 始终是1 的标准和设计。
  • @Kalyan Urimi 你试过了吗?您必须添加限制标头才能使其正常工作。
  • @KalyanUrimi 两台机器都是 8?
猜你喜欢
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 2016-12-13
相关资源
最近更新 更多