开发者社区 问答 正文

Linux fork 多进程 实现拷贝文件 四个进程拷贝

代码有问题 ,段错误

include

include

include

include

include

include

include

include

int main(int argc,char *argv[])
{

char buf[1024];
int fd=open(argv[1],O_RDONLY);
if(fd==-1)
{
perror("open source file failed!");
exit(1);
}

int fd1=open(argv[2],O_WRONLY |O_CREAT| O_EXCL,0777);
if(fd1==-1)
{
perror("open tap file failed!");
exit(1);
}

int len=lseek(fd,0,SEEK_END);

if(len==-1)
{
perror("lseek failed!");
exit(1);
}
int block_size=len%4+1;
// char *buf=NULL;
//char buf[1024];
int i=0;
int pid;
for(i=0;i<3;i++)
{
pid=fork();
if(pid==0)
break;

}
int n=read(fd,buf,block_size);
if(n<0)
{
perror("read failed!");
exit(0);
}
int m=write(fd1,buf,n);

if(pid>0)
while(wait(NULL));

//free(buf);
close(fd);
close(fd1);
return 0;

}

展开
收起
康康&mdash;&mdash;康 2017-10-11 20:13:54 3573 分享 版权
阿里云 AI 助理回答

从您提供的代码片段来看,存在几个潜在的问题可能导致段错误(Segmentation Fault)。段错误通常是因为程序试图访问它没有权限访问的内存区域。下面是一些可能的问题和建议:

  1. 未初始化的变量作为长度使用: 在计算block_size时,您使用了未初始化的变量与数字直接相加:

    int block_size = len % 4 1; // 这里的'1'应该与前面的运算符有误,且未初始化len的值。
    

    应该是:

    int block_size = len % 4 + 1; // 假设意图是如果len不是4的倍数,则块大小为len对4取余后加1,确保至少读一个字节。
    
  2. 潜在的栈溢出风险: 您定义了一个固定大小的缓冲区char buf[1024],但是没有限制从文件中读取的数据量不超过这个缓冲区的大小。在调用read()函数时,如果block_size大于1024,可能会导致栈溢出。确保读取的大小不超过缓冲区的大小。

  3. 逻辑错误: 在fork循环中,您的逻辑可能并非如预期那样工作。特别是,当pid=fork()执行后,直接在if判断内部break,这将导致只有第一个子进程执行后续的读写操作,而其他子进程不会执行这些操作。您可能需要重新考虑这部分的逻辑,以确保每个子进程都能正确地执行任务。

  4. 注释掉的代码和未关闭的括号: 代码中有被注释掉的部分(例如分配动态内存的代码),这可能是尝试解决问题的遗留。同时,最后的几行代码中有多余的注释和未闭合的大括号,这会导致编译错误。

  5. 资源管理: 即使代码片段中有些部分被注释掉了,但正确的资源管理很重要。确保在所有路径上都调用close(fd)close(fd1)来关闭文件描述符,防止资源泄露。

修正这些问题后,您的代码应该能更稳定地运行。请根据上述建议调整代码,并注意在实际应用中进行充分的测试以确保逻辑正确无误。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答