[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: g_spawn and files left locked on windows.
- From: "Ardhan Madras" <ajhwb knac com>
- To: <richard shann virgin net>
- Cc: gtk-app-devel-list gnome org
- Subject: Re: g_spawn and files left locked on windows.
- Date: Tue, 28 Apr 2009 07:45:17 -0700
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 shann virgin net wrote:
From: Richard Shann <richard shann 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
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]