【发布时间】:2011-12-12 08:56:06
【问题描述】:
我编写了一个使用一些低级 I/O 的基本 UNIX 程序。没什么特别的,如果你想看,这里是代码:
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BUFFSIZE 1024
int main(int argc, char *argv[])
{
// Character buffer
char buffer[BUFFSIZE];
// File 1 descriptor
int file1Desc = 0;
// File 2 descriptor
int file2Desc = 0;
// Output file descriptor
int outfileDesc = 0;
// Count # of chars read in
int n = 0;
// Boolean: no stdin reads?
unsigned char zeroSTDIN = 1;
// Need at least two arguments, no more than 3
if((argc < 3) || (argc > 4)){
printf("ERROR!!!\nUsage: kitty file1 file2 <outfile>\n");
return EXIT_FAILURE;
}
/** TRY TO OPEN FILES 1 AND 2 FOR READING **/
// Check for stdin read flag
if(argv[1][0] == '-' && argv[1][1] == '\0'){
file1Desc = STDIN_FILENO;
zeroSTDIN = 0;
}
// Otherwise just open file 1 for reading
else{
if((file1Desc = open(argv[1],O_RDONLY)) < 0){
perror(argv[1]);
printf("ERROR!!!\nUnable to open %s for reading\n",argv[1]);
return EXIT_FAILURE;
}
}
// Check for stdin read flag
if(argv[2][0] == '-' && argv[2][1] == '\0'){
// Only one read from stdin
if(!zeroSTDIN){
perror(argv[2]);
printf("ERROR!!!\nOnly one read from stdin\n",argv[1]);
}
file2Desc = STDIN_FILENO;
}
// Otherwise just open file2 for reading
else{
if((file2Desc = open(argv[2],O_RDONLY)) < 0){
perror(argv[2]);
printf("ERROR!!!\nUnable to open %s for reading\n",argv[2]);
if(file1Desc != STDIN_FILENO)
close(file1Desc);
return EXIT_FAILURE;
}
}
// If argument specified, try to open output file for writing
if(argc == 4){
if((outfileDesc = open(argv[3],O_WRONLY|O_CREAT|O_TRUNC)) < 0){
perror(argv[2]);
printf("ERROR!!!\nUnable to open %s for writing\n",argv[3]);
// Can't forget these
if(file1Desc != STDIN_FILENO)
close(file1Desc);
if(file2Desc != STDIN_FILENO);
close(file2Desc);
return EXIT_FAILURE;
}
}
// stdout otherwise
else{
outfileDesc = STDOUT_FILENO;
}
// While there is anything left to read from file 1
while((n = read(file1Desc, buffer, BUFFSIZE)) > 0){
// Write n chars to output file
if(write(outfileDesc, buffer, n) != n){
printf("Error writing to output file from file 1\n");
return EXIT_FAILURE;
}
}
// While there is anything left to read from file 2
while((n = read(file2Desc, buffer, BUFFSIZE)) > 0){
// Write n chars to output file
if(write(outfileDesc, buffer, n) != n){
printf("Error writing to output file from file 1\n");
return EXIT_FAILURE;
}
}
// Exit program
if(file1Desc != STDIN_FILENO)
close(file1Desc);
if(file2Desc != STDIN_FILENO);
close(file2Desc);
if(argc == 4)
close(outfileDesc);
return 0;
}
它无需任何特殊选项即可编译。但是,我想在 32 位模式下编译。我正在运行 Fedora 15 64 位,它默认为 64 位编译。
我正在尝试使用以下选项:
gcc -S -m32 -O3 -o llio.asm llio.c
所以我想看看正在生成的汇编代码,但我得到以下编译错误:
In file included from /usr/include/features.h:387:0,
from /usr/include/fcntl.h:27,
from kitty.c:1:
/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory
compilation terminated.
这个网站似乎知道我的问题:http://www.cyberciti.biz/faq/x86_64-linux-error-gnustub-32h-missing-error-and-solution/
但是,我看了看,这些文件似乎已经安装了。我错过了什么?
【问题讨论】:
-
您尝试安装
glibc-devel.i386吗?还是glibc-devel-32bit?快点yum。 -
@cnicutar 没有可用的软件包 glibc-devel.i386。错误:无事可做
-
我不确定你是否真的安装了这个包。使用
rpm -qa|grep glibc | grep devel进行检查。 -
@TioPepe 输出:glibc-devel-2.14-5.x86_64