Yes, tried that.  No change in result.

Assuming sqlite does a |F_GETFD| then restores when done.
I built in some testing to see if the file descriptor was being mangled, 
and cannot detect any difference.

Test:

         flags = fcntl(fd[0], F_GETFL, 0);

         char *cFlagMsg;
         cFlagMsg=calloc(255,sizeof(char));
         snprintf(cFlagMsg,255,"%s","FLAGS: ");
         if (flags & O_NONBLOCK)
             strcat(cFlagMsg,"O_NONBLOCK ");
         if (flags & O_APPEND)
             strcat(cFlagMsg,"O_APPEND ");
         if (flags & O_DSYNC)
             strcat(cFlagMsg,"O_DSYNC ");
         if (flags & O_RSYNC)
             strcat(cFlagMsg,"O_RSYNC ");
         if (flags & O_SYNC)
             strcat(cFlagMsg,"O_SYNC ");



Results:
     // before change to O_NONBLOCK
         GETFL Flags= 0
     // after change to O_NONBLOCK
         GETFL Flags= 2048
         FLAGS: O_NONBLOCK


I inserted this code in place of my original calls to open and close:


     sqlite3 *db;
     char *zErrMsg = 0;
     int rc;

     rc = sqlite3_open("/etc/solarwave/aem.db", &db);
     if( rc )
     {
         WriteSyslogMessage("Can't open database: %s\n", 
sqlite3_errmsg(db));
         sqlite3_close(db);
         exit(1);
     }
     rc = sqlite3_exec(db, "SELECT * FROM dbsensors", NULL, 0, &zErrMsg);
     if( rc!=SQLITE_OK )
     {
         WriteSyslogMessage("SQL error: %s\n", zErrMsg);
         sqlite3_free(zErrMsg);
     }
     sqlite3_close(db);


(Note: WriteSyslogMessage() issued a system("logger 'string'"); call)

Same issue.  -1 returned during read().


/m


D. Richard Hipp , On 8/11/2009 15:38:
> On Aug 11, 2009, at 2:53 PM, Mark Richards wrote:
>
>    
>> Environment:
>>      Linux axis 2.6.19 #9 PREEMPT Mon Apr 6 15:44:03 EDT 2009 cris
>> unknown
>>
>> Sqlite:
>>      Sqlite: sqlite-3.6.14
>>    ./configure --host=cris-axis-linux-gnu
>>   --prefix=/AEMDEV/83+/devboard-R2_10/target/cris-axis-linux-gnu
>> --enable-static=yes --enable-shared=yes --disable-dynamic-extensions
>>
>> Application:
>>      My application runs against the shared library built as above.
>>
>> Code in my application fails after calling sqlite3_open().
>>
>> This synopsis is of a function designed to spawn a shell, execute a
>> command, and read back the result via a pipe of stdout.  It works
>> fine,
>> until sqlite3_open() is called anywhere PRIOR.
>>
>> prior sqlite3_open() call:
>>      sqlite3 *dbf;
>>      sqlite3_open("/path/to/my.db",&dbf);
>>
>>
>>          fflush(stdout);
>>          pipe(fd);
>>          pid = fork();
>>          if (pid == 0)
>>          {
>>              dup2(fd[1], STDOUT_FILENO);
>>              dup2(fd[1], STDERR_FILENO);
>>              close(fd[0]);
>>      
> Have you tried called sqlite3_close() here to see if that helps?  All
> of SQLite's file descriptors are FD_CLOEXEC, but who knows....
>
>    
>>              execl("/bin/sh", "sh", "-c", "echo 123", 0);
>>          }
>>          if (-1 == (flags = fcntl(fd[0], F_GETFL, 0)))
>>              flags = 0;
>>          fcntl(fd[0], F_SETFL, flags | O_NONBLOCK);
>>
>>      .. within a loop:
>>
>>          got=read(fd[0], buf, sizeof(buf));
>>          if (got>-1)
>>          {
>>              snprintf(cValue,4,"%s",buf);
>>              break;
>>          }
>>          // got ==-1
>>      
> D. Richard Hipp
> d...@hwaci.com
>
>
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>    

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to