File system structure difference between cp and mv linux commands

Lakshmipathi.G lakshmipathi.g at gmail.com
Wed Jun 2 04:57:32 UTC 2010


If you don't have any  issue- in using system calls directly ,then instead
of
system("mv source target").
use -
link ("source","target") // creat hard link
unlink ("source")         // remove old link

[check "man 2 link" and "man 2 unlink"  for more details]

HTH




On Tue, Jun 1, 2010 at 8:05 PM, Stephen Samuel <samuel at bcgreen.com> wrote:

> Reading the man page for fsync:
>  Calling  fsync()  does not necessarily ensure that the entry in the
> directory containing the file has also reached disk.  For that an explicit
> fsync() on a file descriptor for the directory is also needed.
>
>
> The difference between cp and mv is that mv simply adds a directory entry
> for the existing file in the destination directory.  If the destination is
> on the same filesystem (mount point) then no file data is moved.  The source
> directory entry is then deleted.
>
> cp, on the other hand will create a new file, and copy the data into there.
>
> So, with fsync on mv, there is no buffered data to be written.
> With fsync on cp, there IS data to be written, and it looks like the
> directory entry just happens to get flushed with the file data.
>
> It looks like there MAY be a bit of a bug with fsync not recognizing
> buffered data by a different name, but it should be written to recognize it
> by inode&device numbers, not name.
>
> On Tue, Jun 1, 2010 at 12:43 AM, Indira ramasamy <vel.indira at gmail.com>wrote:
>
>> Hi,
>>
>>   I am facing one problem only with mv command not with cp command. I have
>> a test program
>>
>> #include <stdio.h>
>> #include <string.h>
>> #include <sys/types.h>
>> #include <sys/stat.h>
>> #include <sys/mount.h>
>> #include <fcntl.h>
>> #include <errno.h>
>>
>> int sync_file(char *file)
>> {
>>     FILE *fp=NULL;
>>     int fd;
>>
>>     printf("file is %s\n",file);
>>     fp = fopen(file, "r");
>>     if(!fp)
>>         return -1;
>>
>>     fd = fileno(fp);
>>     fflush(fp);
>>     fsync(fd);
>>     ioctl (fd, BLKFLSBUF, 0);
>>     fclose(fp);
>>     return 0;
>>
>> }
>>
>> int main()
>> {
>>     int len=0;
>>     FILE *fp = NULL;
>>     char buf[1024];
>>     char *fname = "/etc/test.conf";
>>     char fname_tmp[129] = "";
>>
>>
>>     len = sprintf(buf, "%s\n", "Newly added Line is there");
>>
>>     snprintf(fname_tmp, 128, "%s.tmp", fname);
>>
>>     if( (fp = fopen(fname_tmp,"a")) == NULL )
>>         printf(" ERROR: open(), error - %s\n",strerror(errno));
>>
>>     fprintf(fp,"%s",buf);
>>     fflush(fp);
>>
>>     fsync(fileno(fp));
>>     fclose(fp);
>>     system("cp -f /etc/test.conf.tmp /etc/test.conf");
>>    // system("mv -f /etc/test.conf.tmp /etc/test.conf");
>>     sync_file(fname);
>>     return 0;
>> }
>>
>> Here i am opening a tmp file for writing. Then i am copying/moving for
>> original file. Then i do a fflush, fsync(), ioctl() to the original file.
>> Then i run this binary in linux machine(ext2 file system, 2.6.23.5 kernel)
>> after that immediately  power off the machine. Then power on machine, the
>> file is disappeared or written data lost or file gets corrupted if i move
>> the tmp file to the original file. And there is a no problem if i copy the
>> tmp file to original file. So i want to know the difference between the cp
>> and mv command. Can you please give me suggestion on it?
>>
>> Thanks,
>> Indira.
>>
>> _______________________________________________
>> Ext3-users mailing list
>> Ext3-users at redhat.com
>> https://www.redhat.com/mailman/listinfo/ext3-users
>>
>
>
>
> --
> Stephen Samuel http://www.bcgreen.com  Software, like love,
> 778-861-7641                              grows when you give it away
>
> _______________________________________________
> Ext3-users mailing list
> Ext3-users at redhat.com
> https://www.redhat.com/mailman/listinfo/ext3-users
>



-- 
----
Cheers,
Lakshmipathi.G
FOSS Programmer.
www.giis.co.in
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/ext3-users/attachments/20100602/30a67c96/attachment.htm>


More information about the Ext3-users mailing list