我有一个非常简单的源读取文件描述符挂起。 任何人都可以注意到代码有问题吗?
第一个是有问题的来源,第二个是在网络上找到的工作来源。两个来源几乎相同。
第一个来源
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc, char ** argv) {
int n, in;
char buf[1024];
if ((in = open(argv[1], O_RDONLY)<0)) {
perror(argv[1]);
return -1;
}
while((n = read(in, buf, sizeof(buf))) > 0 ) { //HANGS at THIS LINE!!!!!!!!!!!
printf("TEST\n");
}
close(in);
return 0;
}
第二个工作来源来自网上
/*
* ============================================================================
* Name : sp_linux_copy.c
* Author : Marko Martinović
* Description : Copy input file into output file
* ============================================================================
**/
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#define BUF_SIZE 8192
int main(int argc, char* argv[]) {
int input_fd; /* Input and output file descriptors */
ssize_t ret_in; /* Number of bytes returned by read() and write() */
char buffer[BUF_SIZE]; /* Character buffer */
/* Create input file descriptor */
input_fd = open (argv [1], O_RDONLY);
if (input_fd == -1) {
perror ("open");
return 2;
}
/* Copy process */
while((ret_in = read (input_fd, &buffer, BUF_SIZE)) > 0){
printf("TEST\n");
}
/* Close file descriptors */
close (input_fd);
}
答案 0 :(得分:5)
有趣的巧合是,你正在阅读stdin
。这是因为在您的if(in = ...
中,您错放了一些括号。
正在发生的事情是首先评估open(argv[1], O_RDONLY)<0
,并将结果放入in
。由于open()
的结果不小于零(成功打开),in
变为0. stdin
是filedescriptor的名称,为零(在大多数系统上)。所以它是一个有效的文件描述符,阅读非常乐意从中读取。在您在控制台中键入内容之前,它不会得到任何内容。
快速修复:
if ( (in = open(argv[1], O_RDONLY)) < 0) {