为什么C语言中的程序无法在Windows上运行?

时间:2014-08-27 09:30:51

标签: c linux windows

我有一个用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);    
}

3 个答案:

答案 0 :(得分:2)

C程序无法在Windows下运行(尽管C是使用的编程语言)。

什么不是在尝试使用POSIX API函数(例如openreadwrite)使用编译目标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>