Приветствую!Есть такая проблемка. Простенькая программка берет из коммандной строки аргумент и, в зависимости от его значения, выдает в COM порт байтик. При ее запуске от root все работает отлично. А если запускать например от www (эту программку дергает php скриптик), то программа отрабатывает, но в ком порт ничего не выдает и не ругается ни в одной из ключевых точек, таких как открытие порта, заполнение буффера передаваемым байтиком и т.д... НО методом тыка было выясненно, что если убрать неприметный printf из кода, то все начинает работать под любым юзером. Компилится все под FreeBSD 6.0.
Далее код. Место со злополучным printf помеченно.
#include <fcntl.h>
#include <sys/time.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
void AddToLOG(char *logname, char *logstr);
#define BAUDRATE B115200
#define DEFAULT_LOG "server.log"
char InCOMbuf[56];
fd_set readfds;
int fdCOM;
int main (int argc, char* argv[])
{
if (argc < 2)
{
printf("\n Usage: trigger on -turns TX ON \n");
printf(" off -turns TX OFF\n\n");
exit(1);
}
if ((strcmp(argv[1],"on") != 0) && (strcmp(argv[1], "off") != 0))
{
printf("\n Usage: trigger on -turns da TX ON \n");
printf(" off -turns da TX OFF\n\n");
exit(1);
}
char buf[128];
struct termios oldtioA, newtioA;
// AddToLOG(DEFAULT_LOG, "started");
fdCOM = open ("/dev/cuad1", O_RDWR | O_NOCTTY | O_NONBLOCK | O_SYNC);
if(fdCOM < 0)
{
// AddToLOG(DEFAULT_LOG, "Can't open dev/cuad1 !");
printf("Can't open dev/cuad1 ! \n");
exit (-1);
}
tcgetattr (fdCOM, &oldtioA);
bzero (&newtioA, sizeof (newtioA));
newtioA.c_cflag = CS8 | CLOCAL | CREAD;
newtioA.c_iflag = IGNPAR;
newtioA.c_oflag = 0;
newtioA.c_lflag = 0;
newtioA.c_cc[VTIME] = 0;
newtioA.c_cc[VMIN] = 1;
cfsetispeed (&newtioA, BAUDRATE);
cfsetospeed (&newtioA, BAUDRATE);
tcsetattr (fdCOM, TCSANOW, &newtioA);
tcflush (fdCOM, TCIFLUSH);
FD_ZERO(&readfds);
FD_SET(fdCOM, &readfds);
if (strcmp(argv[1], "on") == 0) {sprintf(buf, "o"); /*printf("\nTX ON\n\n");*/ }
if (strcmp(argv[1], "off") == 0) {sprintf(buf, "f"); /*printf("\nTX OFF\n\n");*/ }
/*
!!!!!
Если расскомментировать любой из printf выше, то программа перестает обрабатывать соответствующий аргумент, при этом второй арг. обрабатывается нормально. Т.е. если раскомментировать например первый printf, то программа запущенная с аргументом on выполниться, но в ком порт ничего не выдаст. При этом с аргументом off все пройдем нормально. Еще раз повторюсь, глюки наблюдаются, ТОЛЬКО если программу запускать не из под root'a.
!!!!!
*/
printf("combuf=%s",buf);
//!!!!! Интересно еще и то, что buf во всех случаях несет абсолютно верную информацию.
write(fdCOM, buf, 1);
printf("\n\n TRIGGED \n \n");
tcsetattr (fdCOM, TCSANOW, &oldtioA);
return(0);
}
/////////////////////////////////////////////////////////////////////////////
// //
// FUNCTION: AddToLOG //
// //
// Opens 'logname' file for append access gets current time //
// and write to it 'logstr' when closes file and return //
// //
/////////////////////////////////////////////////////////////////////////////
void AddToLOG(char *logname, char *logstr)
{
FILE *log;
char out[2048];
struct tm *t;
time_t tt;
if((log = fopen(logname, "a+")) == NULL)
{
//file not found then return
printf("!!!FATAL!!! Can't create: %s\n", logname);
exit(1);
}
if(logstr[strlen(logstr)-1] == 0x0A) logstr[strlen(logstr)-1]='\0';
tt = time(NULL);
t = localtime(&tt);
sprintf(out, "[d:d:d] %s\n", t->tm_hour, t->tm_min, t->tm_sec, logstr);
fputs(out, log);
fclose(log);
}