系统调用lseek导致分段错误

时间:2014-03-26 20:30:20

标签: c

我有一个exec文件,我知道有一个(或更多)字符串" coolyo"在其中,需要复制此文件并替换" coolyo"的所有外观。与我的计划收到的论点"使用系统调用。 我有一个条目和system_call函数用汇编语言编写。

然而,当我把我的论点写成与#34; coolyo"相同长度的东西时。 (6),它有效,一切都很好,它取而代之。如果我输入一个参数来替换" coolyo"如果长度小于或大于6,则在尝试运行文件时会出现分段错误。

有什么问题?

在途中,还有两个问题:

  1. 系统调用sys_readsys_write根据收到/发送的字节数更改文件指针? (如果是的话,不应该有问题!但有!)

  2. 当我做sys_read 5个字节,然后重新做sys_read 5个字节,第一次调用后,文件指针在哪里?在5号?还是在1号?意思是,第二个sys_read是从文件[1]还是文件[4]中读取的?

  3. 我的代码:

    int filePtr=-1;
    while(filePtr!=0) {
        char buf[6];
        filePtr=system_call(SYS_READ,newfile,buf,6);
        if(strcmp(buf,"coolyo")==0) {
            system_call(SYS_WRITE,fd,argv[1], strlen(argv[1]));
            system_call(SYS_LSEEK,fd,strlen(argv[1]) - 5, 1);
        }
        else
            system_call(SYS_WRITE,fd,buf,5);
    }
    

1 个答案:

答案 0 :(得分:5)

  1. 读取和写入按读取或写入的字节数提前文件位置
  2. 系统调用在失败时返回否定,您的代码无法处理
  3. 你的方法只能找到" coolyo"在6字节边界上对齐
  4. 你的写电话" coolyo"还没有找到只写五个字节,但你读了6个
  5. read syscall不会附加一个NUL字符,strcmp需要