file sharing in linux

Discussion in 'C Programming' started by smarty, May 13, 2008.

  1. smarty

    smarty Guest

    can any one tell me what's wrong with this program?

    #include<sys/stat.h>
    #include<fcntl.h>
    main()
    {
    int pid,fd,pd;
    pid=fork();
    char *data,*str="child writes to the file";
    if(pid == 0)
    {
    printf("IN CHILD\tcreating a file to COMMUNICATE\n");
    fd=open("sarma.c",O_CREAT|O_APPEND|O_RDWR);
    perror("OPEN OPERATION");
    write(fd, str , 50);
    perror("WRITE OPERATION");
    fsync(fd);
    perror("FSYNC OPERATION");
    close(fd);
    printf("child bids farewell\n");
    }
    else
    {
    printf("IN PARENT\tSLEEPING................\n");
    wait(0);
    printf("IN PARENT\topening the file to COMMUNICATE\n");
    pd=open("sarma.c",O_RDONLY);
    perror("OPEN OPERATION");
    read(pd,data,50);
    perror("READ OPERATION");
    close(pd);
    printf("PARENT reads:\"%s\"\n",data);
    printf("PARENT dies......\n");

    }
    }

    The parent is reading the shared file but with an "illegal file
    access" error.....
    Check out the result on my system

    IN PARENT SLEEPING................
    IN CHILD creating a file to COMMUNICATE
    OPEN OPERATION: Success
    WRITE OPERATION: Illegal seek
    FSYNC OPERATION: Illegal seek
    child bids farewell
    IN PARENT opening the file to COMMUNICATE
    OPEN OPERATION: Success
    READ OPERATION: Illegal seek
    PARENT reads:"child writes to the file"
    PARENT dies......
    Segmentation fault


    what is this segmentation fault for?
    smarty, May 13, 2008
    #1
    1. Advertising

  2. smarty

    Guest

    On May 13, 12:11 pm, smarty <> wrote:
    > can any one tell me what's wrong with this program?
    >
    > #include<sys/stat.h>
    > #include<fcntl.h>
    > main()
    > {
    > int pid,fd,pd;
    > pid=fork();
    > char *data,*str="child writes to the file";
    > if(pid == 0)
    > {
    > printf("IN CHILD\tcreating a file to COMMUNICATE\n");
    > fd=open("sarma.c",O_CREAT|O_APPEND|O_RDWR);
    > perror("OPEN OPERATION");
    > write(fd, str , 50);
    > perror("WRITE OPERATION");
    > fsync(fd);
    > perror("FSYNC OPERATION");
    > close(fd);
    > printf("child bids farewell\n");
    > }
    > else
    > {
    > printf("IN PARENT\tSLEEPING................\n");
    > wait(0);
    > printf("IN PARENT\topening the file to COMMUNICATE\n");
    > pd=open("sarma.c",O_RDONLY);
    > perror("OPEN OPERATION");
    > read(pd,data,50);
    > perror("READ OPERATION");
    > close(pd);
    > printf("PARENT reads:\"%s\"\n",data);
    > printf("PARENT dies......\n");
    >
    > }
    >
    > }
    >
    > The parent is reading the shared file but with an "illegal file
    > access" error.....
    > Check out the result on my system
    >
    > IN PARENT SLEEPING................
    > IN CHILD creating a file to COMMUNICATE
    > OPEN OPERATION: Success
    > WRITE OPERATION: Illegal seek
    > FSYNC OPERATION: Illegal seek
    > child bids farewell
    > IN PARENT opening the file to COMMUNICATE
    > OPEN OPERATION: Success
    > READ OPERATION: Illegal seek
    > PARENT reads:"child writes to the file"
    > PARENT dies......
    > Segmentation fault
    >
    > what is this segmentation fault for?


    Well Dear what is good in this program:
    Issues are:

    No error checking weather file is opened or not.
    You are printing data which contains some garbage reference.
    Please do proper error checking.
    , May 13, 2008
    #2
    1. Advertising

  3. smarty

    Guest

    On May 13, 12:11 pm, smarty <> wrote:
    > can any one tell me what's wrong with this program?
    >
    > #include<sys/stat.h>
    > #include<fcntl.h>
    > main()
    > {
    > int pid,fd,pd;
    > pid=fork();
    > char *data,*str="child writes to the file";
    > if(pid == 0)
    > {
    > printf("IN CHILD\tcreating a file to COMMUNICATE\n");
    > fd=open("sarma.c",O_CREAT|O_APPEND|O_RDWR);
    > perror("OPEN OPERATION");
    > write(fd, str , 50);
    > perror("WRITE OPERATION");
    > fsync(fd);
    > perror("FSYNC OPERATION");
    > close(fd);
    > printf("child bids farewell\n");
    > }
    > else
    > {
    > printf("IN PARENT\tSLEEPING................\n");
    > wait(0);
    > printf("IN PARENT\topening the file to COMMUNICATE\n");
    > pd=open("sarma.c",O_RDONLY);
    > perror("OPEN OPERATION");
    > read(pd,data,50);
    > perror("READ OPERATION");
    > close(pd);
    > printf("PARENT reads:\"%s\"\n",data);
    > printf("PARENT dies......\n");
    >
    > }
    >
    > }
    >
    > The parent is reading the shared file but with an "illegal file
    > access" error.....
    > Check out the result on my system
    >
    > IN PARENT SLEEPING................
    > IN CHILD creating a file to COMMUNICATE
    > OPEN OPERATION: Success
    > WRITE OPERATION: Illegal seek
    > FSYNC OPERATION: Illegal seek
    > child bids farewell
    > IN PARENT opening the file to COMMUNICATE
    > OPEN OPERATION: Success
    > READ OPERATION: Illegal seek
    > PARENT reads:"child writes to the file"
    > PARENT dies......
    > Segmentation fault
    >
    > what is this segmentation fault for?


    And illegal file seek is an error not success. Its not reading file.
    Read operation is failed.
    , May 13, 2008
    #3
  4. On 13 May, 08:11, smarty <> wrote:
    > can any one tell me what's wrong with this program?
    >
    > #include<sys/stat.h>
    > #include<fcntl.h>
    > main()
    > {
    > int pid,fd,pd;
    > pid=fork();
    > char *data,*str="child writes to the file";
    > if(pid == 0)
    > {
    > printf("IN CHILD\tcreating a file to COMMUNICATE\n");
    > fd=open("sarma.c",O_CREAT|O_APPEND|O_RDWR);
    > perror("OPEN OPERATION");
    > write(fd, str , 50);
    > perror("WRITE OPERATION");
    > fsync(fd);
    > perror("FSYNC OPERATION");
    > close(fd);
    > printf("child bids farewell\n");
    > }
    > else
    > {
    > printf("IN PARENT\tSLEEPING................\n");
    > wait(0);
    > printf("IN PARENT\topening the file to COMMUNICATE\n");
    > pd=open("sarma.c",O_RDONLY);
    > perror("OPEN OPERATION");
    > read(pd,data,50);
    > perror("READ OPERATION");
    > close(pd);
    > printf("PARENT reads:\"%s\"\n",data);
    > printf("PARENT dies......\n");
    >
    > }
    >
    > }
    >
    > The parent is reading the shared file but with an "illegal file
    > access" error.....
    > Check out the result on my system
    >
    > IN PARENT SLEEPING................
    > IN CHILD creating a file to COMMUNICATE
    > OPEN OPERATION: Success
    > WRITE OPERATION: Illegal seek
    > FSYNC OPERATION: Illegal seek
    > child bids farewell
    > IN PARENT opening the file to COMMUNICATE
    > OPEN OPERATION: Success
    > READ OPERATION: Illegal seek
    > PARENT reads:"child writes to the file"
    > PARENT dies......
    > Segmentation fault
    >
    > what is this segmentation fault for?


    The first thing wrong with this programme is that
    it contains functions and headers which are not
    part of standard C. It belongs at comp.unix.programmer
    not comp.lang.c

    But here are a couple of comments anyway:
    You are calling perror() when you don't know
    that there has actually been an error hence
    the error message you're getting may well be
    garbage.

    As for the segmentation fault the pointer data
    has not been initialised.
    Spiros Bousbouras, May 13, 2008
    #4
  5. smarty <> wrote:
    > can any one tell me what's wrong with this program?


    Several things already with your use of C. And then it
    uses lots of system specific extensions which should be
    discussed in a group that deals with programming for
    POSIX systems like comp.unix.programmer. I will try to
    concentrate on the C specific issues here (as far as that
    can be untangled). Correct those and then ask for further
    help in the above mentioned group.

    > #include<sys/stat.h>
    > #include<fcntl.h>


    These are both non-standard C headers. While I
    have no idea what you need <fcntl.h> for you
    will need some more of these system specific
    headers, e.g. <unistd.h>, <sys/wait.h> and
    <sys/types.h>.

    And you need a C standard header

    #include <stdio.h>

    for prototypes for printf() and perror().

    > main()


    Since main is always returning an int make that

    int main( void )

    > {
    > int pid,fd,pd;
    > pid=fork();


    A system specific function that also can fail, you should
    check for that. And it returns someting of type 'pid_t'
    which can but doesn't have to be an int...

    > char *data,*str="child writes to the file";
    > if(pid == 0)
    > {
    > printf("IN CHILD\tcreating a file to COMMUNICATE\n");
    > fd=open("sarma.c",O_CREAT|O_APPEND|O_RDWR);


    A system specific function that can fail, you should
    check for that.

    > perror("OPEN OPERATION");


    This is no replacement for error checking since it only
    prints out something but doesn't do anything to deal
    with the error (i.e. if open() failed you probably
    shouldn't trying to write() but instead bail out).

    > write(fd, str , 50);


    Another system specific function. And here you make also a
    bad mistake from a C point of view since you ask write()
    to write more characters to the file then there are in
    the string 'str' points to which entails that write()
    will read past the end of that string, i.e. will
    access memory that doesn't belong to your program.

    > perror("WRITE OPERATION");
    > fsync(fd);


    One more system specific function (and probaby quite
    unnecesarry).

    > perror("FSYNC OPERATION");
    > close(fd);


    And one more of them...

    > printf("child bids farewell\n");
    > }
    > else
    > {
    > printf("IN PARENT\tSLEEPING................\n");
    > wait(0);


    If you believe that this would ensure that the child is
    running first you're mistaken. Hint: the childs PID isn't
    0, it's stored in 'pid' (at least if fork() succeeded).

    > printf("IN PARENT\topening the file to COMMUNICATE\n");
    > pd=open("sarma.c",O_RDONLY);


    Dito.

    > perror("OPEN OPERATION");


    > read(pd,data,50);


    Now, assuming that everything went fine then here
    comes the worst problem: 'data' isn't initialized,
    it points to some random place in memory. And now
    you ask read() to write over that memory. You have
    to allocate an array of 50 characters first, make
    'data; point to that (or define data as a char
    array with 50 elements) before you can use it that
    way. This may be the cause of the segmentation
    fault you get later.

    > perror("READ OPERATION");
    > close(pd);


    Dito.

    > printf("PARENT reads:\"%s\"\n",data);
    > printf("PARENT dies......\n");
    > }
    > }


    main() is supposed to return an int, so you should
    have something like

    return 0;

    before the end of main.

    > The parent is reading the shared file but with an "illegal file
    > access" error.....


    First thing you should do before calling perror() is
    test if there was an error at all. Once you have
    done that and removed the other problems pointed
    out ask in comp.unix.programmer for the system
    specific problems with your program.

    > what is this segmentation fault for?


    Once you wrote to memory that doesn't belong to your
    program all bets are off. Perhaps you wrote over some
    internal data that the program needs while shutting
    down. Or something else...

    Regards, Jens
    --
    \ Jens Thoms Toerring ___
    \__________________________ http://toerring.de
    Jens Thoms Toerring, May 13, 2008
    #5
  6. smarty wrote:
    >
    > can any one tell me what's wrong with this program?
    >

    [...]
    > char *data,*str="child writes to the file";

    [...]
    > read(pd,data,50);

    [...]
    > Segmentation fault
    >
    > what is this segmentation fault for?


    Well, ignoring all the non-standard parts of the program, your
    problem comes down to the above 2 lines. You have passed read()
    an uninitialized pointer, causing the read (if it succeeds) to
    overwrite who-knows-what.

    --
    +-------------------------+--------------------+-----------------------+
    | Kenneth J. Brody | www.hvcomputer.com | #include |
    | kenbrody/at\spamcop.net | www.fptech.com | <std_disclaimer.h> |
    +-------------------------+--------------------+-----------------------+
    Don't e-mail me at: <mailto:>
    Kenneth Brody, May 14, 2008
    #6
  7. On 13 May 2008 at 7:11, smarty wrote:
    > can any one tell me what's wrong with this program?
    >
    > #include<sys/stat.h>
    > #include<fcntl.h>


    Firstly, some missing headers (unistd.h and stdio.h).

    Secondly, this should give you some hints of where to look for problems:

    $ valgrind ./a >/dev/null
    ==14808== Memcheck, a memory error detector.
    ==14808== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et
    al.
    ==14808== Using LibVEX rev 1804, a library for dynamic binary
    translation.
    ==14808== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
    ==14808== Using valgrind-3.3.0-Debian, a dynamic binary instrumentation
    framework.
    ==14808== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et
    al.
    ==14808== For more details, rerun with: -v
    ==14808==
    ==14811== Syscall param open(mode) contains uninitialised byte(s)
    ==14811== at 0x40007F2: (within /lib/ld-2.7.so)
    ==14811== by 0x405F44F: (below main) (in /lib/i686/cmov/libc-2.7.so)
    OPEN OPERATION: Inappropriate ioctl for device
    WRITE OPERATION: Illegal seek
    FSYNC OPERATION: Illegal seek
    ==14811==
    ==14811== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from
    1)
    ==14811== malloc/free: in use at exit: 0 bytes in 0 blocks.
    ==14811== malloc/free: 3 allocs, 3 frees, 1,056 bytes allocated.
    ==14811== For counts of detected errors, rerun with: -v
    ==14811== All heap blocks were freed -- no leaks are possible.
    OPEN OPERATION: Permission denied
    ==14808== Syscall param read(buf) contains uninitialised byte(s)
    ==14808== at 0x40007F2: (within /lib/ld-2.7.so)
    ==14808== by 0x405F44F: (below main) (in /lib/i686/cmov/libc-2.7.so)
    ==14808== Warning: invalid file descriptor -1 in syscall read()
    READ OPERATION: Bad file descriptor
    ==14808== Warning: invalid file descriptor -1 in syscall close()
    ==14808==
    ==14808== Conditional jump or move depends on uninitialised value(s)
    ==14808== at 0x4087B0E: vfprintf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x40901D2: printf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x8048680: main (a.c:30)
    ==14808==
    ==14808== Use of uninitialised value of size 4
    ==14808== at 0x40239D8: strlen (mc_replace_strmem.c:242)
    ==14808== by 0x408A681: vfprintf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x40901D2: printf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x8048680: main (a.c:30)
    ==14808==
    ==14808== Use of uninitialised value of size 4
    ==14808== at 0x40239E3: strlen (mc_replace_strmem.c:242)
    ==14808== by 0x408A681: vfprintf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x40901D2: printf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x8048680: main (a.c:30)
    ==14808==
    ==14808== Conditional jump or move depends on uninitialised value(s)
    ==14808== at 0x40244B7: mempcpy (mc_replace_strmem.c:77)
    ==14808== by 0x40AE345: _IO_file_xsputn (in
    /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x408A952: vfprintf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x40901D2: printf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x8048680: main (a.c:30)
    ==14808==
    ==14808== Conditional jump or move depends on uninitialised value(s)
    ==14808== at 0x4024540: mempcpy (mc_replace_strmem.c:80)
    ==14808== by 0x40AE345: _IO_file_xsputn (in
    /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x408A952: vfprintf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x40901D2: printf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x8048680: main (a.c:30)
    ==14808==
    ==14808== Conditional jump or move depends on uninitialised value(s)
    ==14808== at 0x40244CE: mempcpy (mc_replace_strmem.c:676)
    ==14808== by 0x40AE345: _IO_file_xsputn (in
    /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x408A952: vfprintf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x40901D2: printf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x8048680: main (a.c:30)
    ==14808==
    ==14808== Conditional jump or move depends on uninitialised value(s)
    ==14808== at 0x402450E: mempcpy (mc_replace_strmem.c:676)
    ==14808== by 0x40AE345: _IO_file_xsputn (in
    /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x408A952: vfprintf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x40901D2: printf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x8048680: main (a.c:30)
    ==14808==
    ==14808== Conditional jump or move depends on uninitialised value(s)
    ==14808== at 0x4024556: mempcpy (mc_replace_strmem.c:676)
    ==14808== by 0x40AE345: _IO_file_xsputn (in
    /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x408A952: vfprintf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x40901D2: printf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x8048680: main (a.c:30)
    ==14808==
    ==14808== Use of uninitialised value of size 4
    ==14808== at 0x4024563: mempcpy (mc_replace_strmem.c:676)
    ==14808== by 0x40AE345: _IO_file_xsputn (in
    /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x408A952: vfprintf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x40901D2: printf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x8048680: main (a.c:30)
    ==14808==
    ==14808== Use of uninitialised value of size 4
    ==14808== at 0x4024570: mempcpy (mc_replace_strmem.c:676)
    ==14808== by 0x40AE345: _IO_file_xsputn (in
    /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x408A952: vfprintf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x40901D2: printf (in /lib/i686/cmov/libc-2.7.so)
    ==14808== by 0x8048680: main (a.c:30)
    ==14808==
    ==14808== ERROR SUMMARY: 254 errors from 11 contexts (suppressed: 11
    from 1)
    ==14808== malloc/free: in use at exit: 0 bytes in 0 blocks.
    ==14808== malloc/free: 2 allocs, 2 frees, 704 bytes allocated.
    ==14808== For counts of detected errors, rerun with: -v
    ==14808== All heap blocks were freed -- no leaks are possible.
    Antoninus Twink, May 15, 2008
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. =?Utf-8?B?QlBlYXJzb24=?=

    Multiple sites sharing single web.config file

    =?Utf-8?B?QlBlYXJzb24=?=, Feb 9, 2004, in forum: ASP .Net
    Replies:
    5
    Views:
    3,907
    Maxim Kazitov
    Feb 10, 2004
  2. Aaron Prohaska

    Sharing style sheet and javascript file

    Aaron Prohaska, Jan 17, 2005, in forum: ASP .Net
    Replies:
    1
    Views:
    312
    Peter Chadwick (MCP)
    Jan 17, 2005
  3. sanjeeev
    Replies:
    3
    Views:
    518
    Patrice
    Apr 14, 2005
  4. Peter Trei
    Replies:
    0
    Views:
    339
    Peter Trei
    Jun 10, 2004
  5. James
    Replies:
    2
    Views:
    2,389
    Patrice
    May 2, 2006
Loading...

Share This Page