我有一个用C语言编写的Linux程序,它在Linux平台上运行良好,但它在Windows中不起作用。它使用代码块(mingw32-gcc)在Windows中成功编译,但它没有按预期工作,它只是抛出错误并杀死程序。如何让它在Windows上运行,请帮忙。这是代码:
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i, size, k = 2, ftab, sect = 3;
char buf[512];
char vbuf;
int dev, fil_descr, off=0;
fil_descr = open(argv[2], O_RDONLY);
assert(fil_descr > 0);
read(fil_descr, buf, 512);
close(fil_descr);
printf("Bootsector file: %s\n" ,argv[2]);
dev=open(argv[1], O_RDWR);
assert(dev > 0);
write(dev, buf, 512);
ftab = open("filetable", O_CREAT|O_RDWR);
sprintf(buf, "{");
write(ftab, buf, 1);
for(i = 3; i < argc; i++)
{
off = off + (k * 512);
lseek(dev, off, SEEK_SET);
fil_descr=open(argv[i], O_RDONLY);
assert(fil_descr > 0);
size = 0;
while((read(fil_descr, &vbuf, 1))!=0)
{
size++;
write(dev, &vbuf, 1);
}
k = (size > 512)?2:1;
sprintf(buf, "%s-%d," ,argv[i], sect);
write(ftab, buf, strlen(buf));
printf("Input file \'%s\' written at offset %d\n", argv[i], off);
close(fil_descr);
sect = sect + k;
}
sprintf(buf,"}");
write(ftab, buf, 1);
lseek(ftab, 0, SEEK_SET);
read(ftab, buf, 512);
lseek(dev, 512, SEEK_SET);
write(dev, buf, 512);
close (dev);
close(ftab);
}
答案 0 :(得分:2)
不 C程序无法在Windows下运行(尽管C是使用的编程语言)。
什么不是在尝试使用POSIX API函数(例如open
,read
,write
)使用编译目标Win32来编译程序。这包括使用在这种环境中不存在的几个标题(如果它们存在,则会声明系统中不存在的函数)。
你要么必须使用Unix兼容层(微软用于销售它,不确定它们是否仍然存在,Cygwin也可以工作),或使用适当的C,或使用本机Win32 API函数。
也就是说,如果切换到使用C标准库I / O函数或本机Win32函数,它也可能无法以预期的方式工作。输出&#34; Bootsector:
&#34;建议您尝试一些根本不能在系统驱动器上运行的东西,并且只能在另一个磁盘上使用管理权限。
答案 1 :(得分:1)
为了调试这样的问题,你应该添加一些代码行来帮助你这样做。
我将程序的各个部分更改为
printf("Bootsector file: %s\n" ,argv[2]);
fil_descr = open(argv[2], O_RDONLY);
if (fil_descr < 0) {
perror("open");
}
printf("fil_descr: %d\n", fil_descr);
assert(fil_descr > 0);
并意识到第二个命令行参数必须是要读取的文件的文件名。
如果我正确指定,它可以正常工作。
正在写入第一个文件,其余参数也是要读取的文件名。
答案 2 :(得分:0)
这两个标题都是特定于Linux的,
#include <sys/types.h>
#include <unistd.h>