c - 为什么用 C 编写的程序不能在 Windows 上运行?

标签 c linux windows

我有一个用 C 语言在 Linux 中编写的程序,它在 Linux 平台上运行良好,但在 Windows 上运行不佳。它在 Windows 中使用代码块 (mingw32-gcc) 编译成功,但它没有按预期工作,它只是抛出一个错误并终止程序。我怎样才能让它在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);    
}

最佳答案

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

尝试使用 POSIX API 函数(例如 openreadwrite)编译程序是行不通的针对 Win32 的编译器。这包括使用此环境中不存在的多个 header (如果存在,将声明系统中不存在的函数)。

您将不得不使用 Unix 兼容层(Microsoft 曾经出售过它,不确定他们是否仍然这样做,Cygwin 也可能工作),或者使用适当的 C,或者使用 native Win32 API 函数。

也就是说,如果您切换到使用 C 标准库 I/O 函数或 native Win32 函数,它也可能无法按预期方式工作。输出“Bootsector:”表明您正在尝试的东西在系统驱动器上根本不起作用,只能在另一个磁盘上使用管理权限。

关于c - 为什么用 C 编写的程序不能在 Windows 上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25523571/

相关文章:

c++ - 使用 pselect 进行同步等待

python - 什么是 Linux 下软实时数据采集的良好存储候选者?

Java 类在 Linux 服务器中消耗大量内存?

linux - Unix - 使用 shell 脚本的简单计算器 [已编辑]

c - 如何实现链表删除?

c - 将函数指针分配给另一个函数内的函数

windows - 在我的 Windows 7 系统上找不到 jdk?

python - wxPython 列表框的键盘接口(interface)

javascript - JavaScript 可以删除所有的工具栏、地址栏和窗口的设置大小吗?

c - 如何释放这个 char** 数组?