![]() |
file sharing in linux
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? |
Re: file sharing in linux
On May 13, 12:11 pm, smarty <csmgsa...@gmail.com> 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. |
Re: file sharing in linux
On May 13, 12:11 pm, smarty <csmgsa...@gmail.com> 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. |
Re: file sharing in linux
On 13 May, 08:11, smarty <csmgsa...@gmail.com> 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. |
Re: file sharing in linux
smarty <csmgsarma@gmail.com> 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 ___ jt@toerring.de \__________________________ http://toerring.de |
Re: file sharing in linux
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:ThisIsASpamTrap@gmail.com> |
Re: file sharing in linux
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. |
| All times are GMT. The time now is 10:47 AM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.