correct getFileContentEx read bytes
parent
27046ca80c
commit
5359199fb7
3
HISTORY
3
HISTORY
|
|
@ -1,4 +1,7 @@
|
||||||
|
|
||||||
|
Version 1.36 2017-03-08
|
||||||
|
* correct getFileContentEx read bytes
|
||||||
|
|
||||||
Version 1.35 2017-03-02
|
Version 1.35 2017-03-02
|
||||||
* logger judge log_level in function log_it_ex and log_it_ex1
|
* logger judge log_level in function log_it_ex and log_it_ex1
|
||||||
* add php extension function: fastcommon_file_put_contents
|
* add php extension function: fastcommon_file_put_contents
|
||||||
|
|
|
||||||
|
|
@ -17,12 +17,11 @@ int get_pid_from_file(const char *pidFilename, pid_t *pid)
|
||||||
return errno != 0 ? errno : EPERM;
|
return errno != 0 ? errno : EPERM;
|
||||||
}
|
}
|
||||||
|
|
||||||
file_size = sizeof(buff) - 1;
|
file_size = sizeof(buff);
|
||||||
if ((result=getFileContentEx(pidFilename, buff, 0, &file_size)) != 0) {
|
if ((result=getFileContentEx(pidFilename, buff, 0, &file_size)) != 0) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
*(buff + file_size) = '\0';
|
|
||||||
*pid = strtol(buff, NULL, 10);
|
*pid = strtol(buff, NULL, 10);
|
||||||
if (*pid == 0) {
|
if (*pid == 0) {
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
@ -150,14 +149,27 @@ static const char *process_get_exename(const char* program)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *get_exename_by_pid(const pid_t pid, char *buff,
|
||||||
|
const int buff_size, int *result)
|
||||||
|
{
|
||||||
|
char cmdfile[MAX_PATH_SIZE];
|
||||||
|
int64_t cmdsz;
|
||||||
|
|
||||||
|
cmdsz = buff_size;
|
||||||
|
sprintf(cmdfile, "/proc/%d/cmdline", pid);
|
||||||
|
if ((*result=getFileContentEx(cmdfile, buff, 0, &cmdsz)) != 0) {
|
||||||
|
fprintf(stderr, "read file %s fail, errno: %d, error info: %s\n",
|
||||||
|
cmdfile, *result, strerror(*result));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return process_get_exename(buff);
|
||||||
|
}
|
||||||
|
|
||||||
int process_start(const char* pidFilename)
|
int process_start(const char* pidFilename)
|
||||||
{
|
{
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int result;
|
int result;
|
||||||
char cmdline[MAX_PATH_SIZE];
|
|
||||||
char cmdfile[MAX_PATH_SIZE];
|
|
||||||
char argv0[MAX_PATH_SIZE];
|
|
||||||
int64_t cmdsz;
|
|
||||||
|
|
||||||
if ((result=get_pid_from_file(pidFilename, &pid)) != 0) {
|
if ((result=get_pid_from_file(pidFilename, &pid)) != 0) {
|
||||||
if (result == ENOENT) {
|
if (result == ENOENT) {
|
||||||
|
|
@ -172,30 +184,30 @@ int process_start(const char* pidFilename)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kill(pid, 0) == 0) {
|
if (kill(pid, 0) == 0) {
|
||||||
const char *exename1, *exename2;
|
if (access("/proc", F_OK) == 0) {
|
||||||
cmdsz = sizeof(cmdline);
|
char cmdline[MAX_PATH_SIZE];
|
||||||
cmdline[cmdsz-1] = argv0[cmdsz-1] = '\0';
|
char argv0[MAX_PATH_SIZE];
|
||||||
sprintf(cmdfile, "/proc/%d/cmdline", pid);
|
const char *exename1, *exename2;
|
||||||
if ((result=getFileContentEx(cmdfile, cmdline, 0, &cmdsz)) != 0) {
|
|
||||||
fprintf(stderr, "read file %s failed. %d %s\n",
|
exename1 = get_exename_by_pid(pid, cmdline, sizeof(cmdline), &result);
|
||||||
cmdfile, errno, strerror(errno));
|
if (exename1 == NULL) {
|
||||||
return result;
|
return result;
|
||||||
|
}
|
||||||
|
exename2 = get_exename_by_pid(getpid(), argv0, sizeof(argv0), &result);
|
||||||
|
if (exename2 == NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (strcmp(exename1, exename2) == 0) {
|
||||||
|
fprintf(stderr, "process %s already running, pid: %d\n",
|
||||||
|
argv0, (int)pid);
|
||||||
|
return EEXIST;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
cmdsz = sizeof(argv0);
|
else {
|
||||||
sprintf(cmdfile, "/proc/%d/cmdline", getpid());
|
fprintf(stderr, "process already running, pid: %d\n", (int)pid);
|
||||||
if ((result=getFileContentEx(cmdfile, argv0, 0, &cmdsz)) != 0) {
|
|
||||||
fprintf(stderr, "read file %s failed. %d %s\n",
|
|
||||||
cmdfile, errno, strerror(errno));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
exename1 = process_get_exename(cmdline);
|
|
||||||
exename2 = process_get_exename(argv0);
|
|
||||||
if (strcmp(exename1, exename2) == 0) {
|
|
||||||
fprintf(stderr, "process %s already running, pid: %d\n",
|
|
||||||
argv0, (int)pid);
|
|
||||||
return EEXIST;
|
return EEXIST;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
else if (errno == ENOENT || errno == ESRCH) {
|
else if (errno == ENOENT || errno == ESRCH) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -1085,7 +1085,7 @@ int getFileContentEx(const char *filename, char *buff, \
|
||||||
return errno != 0 ? errno : EIO;
|
return errno != 0 ? errno : EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((read_bytes=read(fd, buff, *size)) < 0)
|
if ((read_bytes=read(fd, buff, *size - 1)) < 0)
|
||||||
{
|
{
|
||||||
*size = 0;
|
*size = 0;
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue