shell awk printf转int
时间: 2023-11-15 13:06:38 浏览: 111
在awk中,可以使用函数`int()`将字符串转换为整数。例如,假设有一个字符串变量`str="123"`,可以使用`int(str)`将其转换为整数类型。
在printf中,可以使用格式控制符%d将变量输出为整数类型。例如:
```
awk 'BEGIN{a="123"; printf("%d\n", int(a))}'
```
这将输出整数类型的值123。
相关问题
adb shell 十六进制字符串转十进制int
你可以使用以下命令将十六进制字符串转换为十进制整数:
```
echo $HEX_STRING | awk '{printf("%d\n",strtonum(0$1))}'
```
其中 `$HEX_STRING` 是你要转换的十六进制字符串。使用此命令,你可以在 adb shell 中将十六进制字符串转换为十进制整数。
#include <unistd.h> #include <sys/types.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <signal.h> //下一步时间间隔 #define TIME_NEXT 50 //定义信号,此处直接使用系统信号,项目中可根据需要自定义信号值#define SIG_UI_QUIT35 #define SIG_PHONE_QUIT 36 #define SIG_UI_QUIT 35 //定义通话状态 enum TASK_PHONE_STATE { TASK_PHONE_STATE_NONE = 0, TASK_PHONE_STATE_RING, TASK_PHONE_STATE_TALK, TASK_PHONE_STATE_HANGUP, }; int phone_state = TASK_PHONE_STATE_NONE; //设置通话状态 void set_state(int state) { phone_state = state; } //获取通话状态 int get_state(void) { return phone_state; } int get_ui_pid() { int pid = -1; FILE *fp = NULL; char buf[12] = {0}; //打开管道,执行 shell 命令查找进程名为task_ui_sig 的pid fp = popen("ps -e I grep \'task_ui_sig\' | awk \'{print $1}\'", "r"); fgets(buf, sizeof(buf), fp); if (strlen(buf) > 0) { pid = atoi(buf); } return pid; } //信号处理函数 void sig_deal(int sig) { if (sig == SIG_UI_QUIT) { printf("Task ui hangup!\n"); set_state(TASK_PHONE_STATE_HANGUP); } } int main(void) { int time = 0; //设置SIG UI QUIT信号处理函数 signal(SIG_UI_QUIT, sig_deal); while (1) { /*模拟与其他用户处理通信协议,每隔5s进入下一状态*/ time++; if (time >= TIME_NEXT) { time = 0; if (get_state() == TASK_PHONE_STATE_RING) { set_state(TASK_PHONE_STATE_TALK); } else if (get_state() == TASK_PHONE_STATE_TALK) { set_state(TASK_PHONE_STATE_HANGUP); } else { set_state(TASK_PHONE_STATE_RING); } printf("Current state is %d!\n", get_state()); /*若当前通话状态为挂断,则退出任务,并发送信号给UI*/ if (get_state() == TASK_PHONE_STATE_HANGUP) { if (get_ui_pid() > 0) { kill(get_ui_pid(), SIG_UI_QUIT); printf("Send quit msg!\n"); } break; } usleep(100 * 1000); } return 0; } }这段代码有什么bug
这段代码存在一个逻辑错误,导致程序无法正常退出。具体来说,在while循环中,当通话状态为挂断时,会调用kill函数发送SIG_UI_QUIT信号给UI进程,然后退出循环。但是,由于kill函数是异步的,它发送信号的时刻是不确定的。因此,如果kill函数在循环结束之后才执行,就会导致UI进程收不到信号,从而无法正常退出。为了解决这个问题,可以在发送信号之后添加一个sleep函数,让程序等待一段时间,确保信号被UI进程接收到。修改后的代码如下:
```c
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#define TIME_NEXT 50
#define SIG_UI_QUIT 35
#define SIG_PHONE_QUIT 36
enum TASK_PHONE_STATE {
TASK_PHONE_STATE_NONE = 0,
TASK_PHONE_STATE_RING,
TASK_PHONE_STATE_TALK,
TASK_PHONE_STATE_HANGUP,
};
int phone_state = TASK_PHONE_STATE_NONE;
void set_state(int state) {
phone_state = state;
}
int get_state(void) {
return phone_state;
}
int get_ui_pid() {
int pid = -1;
FILE *fp = NULL;
char buf[12] = {0};
fp = popen("ps -e I grep \'task_ui_sig\' | awk \'{print $1}\'", "r");
fgets(buf, sizeof(buf), fp);
if (strlen(buf) > 0) {
pid = atoi(buf);
}
return pid;
}
void sig_deal(int sig) {
if (sig == SIG_UI_QUIT) {
printf("Task ui hangup!\n");
set_state(TASK_PHONE_STATE_HANGUP);
}
}
int main(void) {
int time = 0;
signal(SIG_UI_QUIT, sig_deal);
while (1) {
time++;
if (time >= TIME_NEXT) {
time = 0;
if (get_state() == TASK_PHONE_STATE_RING) {
set_state(TASK_PHONE_STATE_TALK);
} else if (get_state() == TASK_PHONE_STATE_TALK) {
set_state(TASK_PHONE_STATE_HANGUP);
} else {
set_state(TASK_PHONE_STATE_RING);
}
printf("Current state is %d!\n", get_state());
if (get_state() == TASK_PHONE_STATE_HANGUP) {
int ui_pid = get_ui_pid();
if (ui_pid > 0) {
kill(ui_pid, SIG_UI_QUIT);
printf("Send quit msg!\n");
sleep(1); // 等待信号被接收
}
break;
}
}
usleep(100 * 1000);
}
return 0;
}
```
阅读全文