As far i know in win32, if a process is opening a new file, then normally 
another process couldn't write or remove it. It's maybe a synchronization 
method offered by win32 by automatically locking a file descriptor. Linux 
doesn't automatically provide such a file locking mechanism to a file opened by 
a process.

So if the file left locked, there are must be a process which still open the 
file or a file is still left opened. Win32 maybe doesn't automatically release 
such as opened file's resources.

In your project or demonstration code: I see you don't fclose() your file 
before exit (actually i don't know if this have the 'locking effect'), and you 
may interest using a GIOChannel for file operations.

--- ajhwb


--- richard.sh...@virgin.net wrote:

From: Richard Shann <richard.sh...@virgin.net>
To: gtk-app-devel-list@gnome.org
Subject: Re: g_spawn and files left locked on windows.
Date: Tue, 28 Apr 2009 08:39:12 +0100

On Mon, 2009-04-27 at 12:52 +0300, Tor Lillqvist wrote:
> > My application invokes the lilypond program using the g_spawn...
> > functions. This works fine on linux, but on windows the files created by
> > lilypond are left locked when lilypond has exited.
> 
> That sounds very odd and in fact impossible. Are you confusing file
> protection with locking?
Thank you for the quick and helpful reply. Having contstructed the
minimal example, everything worked fine. 
For those listening in who need to create a glib standalone minimal
example. I append the code I devised.
Richard
/************ first program, invoked by the one below *************/
#include <stdio.h>

/*
program doit
 gcc test.c -o doit.exe
*/
int main(void) {
  printf("Opening the test file now\n");
  FILE *fp = fopen("thetestfile","w");
  if(fp==NULL) {
  printf("doit could not open the test file");
  return -1;
  }
  printf("Writing to the test file now\n");
  fprintf(fp, "hello");
  fclose(fp);
  return 0;
}

/****************** second program, invoking the first *********************/

/*
program test
 gcc  test.c -o test.exe -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include  
/usr/lib/libglib-2.0.so
*/
#include <stdio.h>
#include <glib.h>
static GPid pid = -1;
void finished(void) {
  g_spawn_close_pid (pid);
  FILE *fp = fopen("thetestfile","rw");
  if(fp==NULL) {
    g_print("could not open\n");
    exit(-1);
  }
  g_print("The file opens ok\n");
  exit(0);
}

int main(void) {
  g_print("Starting the test\n");
  gchar *arguments[] = {
    "doit.exe",
    NULL
  };
  g_spawn_async_with_pipes (NULL,               /* dir */
                arguments, NULL,        /* env */
                G_SPAWN_SEARCH_PATH  | G_SPAWN_DO_NOT_REAP_CHILD, NULL, /* 
child setup func */
                NULL,           /* user data */
                &pid,
                NULL,
                NULL,           /* stdout */
                NULL,           /* stderr */
                NULL);
 g_child_watch_add (pid, (GChildWatchFunc)finished, NULL);
 g_print("looping for ever, Ctrl-C to kill\n");
 GMainLoop* gm = g_main_loop_new(NULL, 0);
 g_main_loop_run(gm);
}


_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list




_____________________________________________________________
Listen to KNAC, Hit the Home page and Tune In Live! ---> http://www.knac.com
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to