Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 正在读取不包含';不存在_C_Unix_System Calls - Fatal编程技术网

C 正在读取不包含';不存在

C 正在读取不包含';不存在,c,unix,system-calls,C,Unix,System Calls,我有一个小程序,它使用系统调用read打印文件的内容 unsigned char buffer[8]; size_t offset=0; size_t bytes_read; int i; int fd = open(argv[1], O_RDONLY); do{ bytes_read = read(fd, buffer, sizeof(buffer)); printf("0x%06x : ", offset); for(i=0; i<bytes_read;

我有一个小程序,它使用系统调用read打印文件的内容

unsigned char buffer[8];
size_t offset=0;
size_t bytes_read;

int i;

int fd = open(argv[1], O_RDONLY);

do{
    bytes_read = read(fd, buffer, sizeof(buffer));
    printf("0x%06x : ", offset);

    for(i=0; i<bytes_read; ++i)
    {
        printf("%c ", buffer[i]);
    }
    printf("\n");
    offset = offset + bytes_read;
}while(bytes_read == sizeof(buffer));
无符号字符缓冲区[8];
尺寸偏差=0;
读取的字节大小;
int i;
int fd=打开(argv[1],仅限Ordu);
做{
字节_read=read(fd,buffer,sizeof(buffer));
printf(“0x%06x:,偏移量);

对于(i=0;i在使用之前,您可能应该检查
open
返回的文件描述符是否有效。根据,您应该得到有效文件的非否定响应。从无效描述符读取很可能是问题的根源。

这是打印垃圾,因为
fd
将始终设置为-1,而不是传递给
read
是一件好事,因为它除了返回-1之外什么也不做。它会让缓冲区保持不变,这意味着它保存着你启动时在那里的垃圾

您可能会将整个
do
循环放入如下内容:

if (fd == -1) {
    printf ("error here");
} else {
    // do loop here
}

成功完成后,open函数将打开文件并返回一个表示文件描述符的非负整数。否则,将返回-1,并设置errno以指示错误。因此,请在进入循环执行读取之前检查fd。

read返回-1,因为fd无效,您将其存储在字节中ch的类型是size_t,它是无符号的,因此循环打印(size_t)-1个字符,这是一个非常大的数字,比缓冲区的大小大得多。因此,您打印了一大块地址空间,然后在最终到达末尾并访问无效地址时得到一个SEGFULT

正如其他人所提到的(没有回答您的实际问题),您应该检查open的结果是否有错误。例如

int fd = open(argv[1], O_RDONLY);
if( fd < 0 ){
    fprintf(stderr, "error opening %s: %s\n", argv[1], strerror(errno));
    exit(1);
}

这不是一个好的测试,因为read返回的值可能小于您要求的值。您的循环应该继续,直到read返回。这是一个很好的建议,但它没有回答您提出的问题。啊,但是缓冲区只有8字节长,这对于“混合了环境变量的某种数据”来说是不够的,读取它不应该导致segfault。需要对代码进行一点思考和检查,才能理解程序为什么要执行它正在执行的操作…请参阅我的答案。这是一个很好的额外分析,@Jim,但是,这并没有改变一个事实,即所有问题的根本原因是OP忽略了错误条件。这两个打开和读取的turn值应检查-1。通过正确的错误检查,所有问题都会消失。您所说的一切都是正确的,但它并没有回答OP的问题,即程序如何完成它所做的事情。可能性是OP已经意识到他应该检查打开的返回,因为他知道文件没有吉姆:我会对额外的分析投赞成票,但对于“这怎么可能?程序打印是什么?”我想我回答得很好,尽管我当然有偏见:-)问题是缺少错误检查。解决了这个问题,问题就消失了。我们都知道问题和解决方案是什么,但这不是问题的答案,需要的不仅仅是“偏见”看不到或不承认。从无效的文件描述符读取返回-1。仔细检查程序会发现为什么会导致观察到的行为。请查看我的答案,它解决了您实际提出的问题。谢谢Jim。它的解释再好不过了。
while(bytes_read == sizeof(buffer))