void getCmdResult(const char* cmd, char** resultbuf, size_t* bufsize) { FILE* fp = popen(cmd, "r"); if (fp) { *resultbuf = malloc(*bufsize); fgets(*resultbuf, *bufsize, fp); pclose(fp); } } HUAYI_BOOL checkFileExistsAndNotEmpty(const char* filename) { // 检查文件是否存在 if (access(filename, F_OK) == -1) { return HUAYI_FALSE; } // 检查文件大小是否为0 struct stat fileStat; if (stat(filename, &fileStat) == -1) { return HUAYI_FALSE; } if (fileStat.st_size == 0) { return HUAYI_FALSE; } return HUAYI_TRUE; } void assignValue(void* arg, const char* token) { if (arg == NULL || token == NULL) { return; } if (strncmp(token, " ", 1) == 0) { return; } if (isdigit(token[0])) { int* intValue = (int*)arg; *intValue = atoi(token); } else { char* strValue = (char*)arg; strcpy(strValue, token); } } HUAYI_BOOL TcpObtainServervalue(int count, ...) { char* resultbuf = NULL; size_t bufsize = 1024; char cmd[TEMP_STR_LEN]; int counter = 0; va_list args; va_start(args, count); strcpy(cmd, "cat /tmp/returnValue"); do { if (counter > 10) { return HUAYI_FALSE; } else if (counter) { sleep(1); } if (resultbuf) { free(resultbuf); } getCmdResult(cmd, &resultbuf, &bufsize); counter++; } while (!checkFileExistsAndNotEmpty("/tmp/returnValue")); char* token = strtok(resultbuf, " "); int i = 0; while (token != NULL && i < count) { void* arg = va_arg(args, void*); assignValue(arg, token); token = strtok(NULL, " "); i++; } va_end(args); unlink("/tmp/returnValue"); free(resultbuf); return HUAYI_TRUE; }char name[3][128;]TcpObtainServervalue(3, name[1], name[2], name[0]);
时间: 2024-04-10 09:32:15 浏览: 53
这段代码是一个函数`TcpObtainServervalue`的实现,该函数通过执行系统命令获取服务器的返回值,并将返回值分配给传入的参数。具体的实现逻辑如下:
1. 首先定义了一个指针`resultbuf`和一个变量`bufsize`,用于存储命令执行的结果和结果的大小。
2. 创建一个文件指针`fp`,通过调用`popen`函数执行指定的命令,并将结果写入`fp`。
3. 如果`fp`指针不为空,说明命令执行成功,接着动态分配内存给`resultbuf`,大小为`bufsize`。
4. 调用`fgets`函数从`fp`中读取命令执行结果,并将结果存储在`resultbuf`中。
5. 关闭文件指针`fp`,释放内存。
6. 接下来定义了一个函数`checkFileExistsAndNotEmpty`,用于检查文件是否存在且大小不为0。首先使用`access`函数检查文件是否存在,如果不存在则返回假。然后使用`stat`函数获取文件的状态信息,如果获取失败则返回假。最后判断文件大小是否为0,如果为0则返回假,否则返回真。
7. 定义了一个函数`assignValue`,用于根据传入的参数类型将字符串值转换为相应的类型。首先检查传入的参数是否为空,如果为空则直接返回。然后判断传入的字符串是否以空格开头,如果是则返回。接着判断字符串的首字符是否为数字,如果是则将字符串转换为整数并赋值给指针类型的参数,否则将字符串复制给指针类型的参数。
8. 最后是函数`TcpObtainServervalue`的实现。函数接受一个可变参数的个数和对应个数的参数,其中第一个参数为个数,后续参数为需要分配值的变量。首先定义了一个字符数组`cmd`,用于存储执行的命令。然后使用`va_start`宏初始化可变参数列表。
9. 将命令字符串`"cat /tmp/returnValue"`复制给`cmd`。
10. 进入一个循环,循环条件是文件`/tmp/returnValue`不存在或者为空。在每次循环中,首先判断循环次数是否超过10次,如果超过则返回假。然后判断循环次数是否大于0,如果大于0则调用`sleep`函数暂停1秒。接着释放`resultbuf`的内存,然后调用`getCmdResult`函数执行命令,并将结果赋值给`resultbuf`和`bufsize`。循环次数加1。
11. 在循环结束后,使用`strtok`函数将结果字符串分割成多个子字符串,以空格作为分隔符。然后依次遍历每个子字符串,并将其赋值给对应的参数。
12. 最后调用`va_end`宏结束可变参数列表,删除临时文件`/tmp/returnValue`,释放`resultbuf`的内存,返回真。
13. 最后一行代码是调用`TcpObtainServervalue`函数,并传入3个参数`name[1]`、`name[2]`、`name[0]`。
阅读全文