记录一个linux进程不运行不崩溃的问题

程序设计为不断连接并断开数据库,使用Linux命令而非API进行连接。在循环运行一段时间后,进程进入无法中断的休眠状态。尝试理解和解决进程中线程交互导致的异常行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序需求是不断连接数据库,并断开,再连接,反复循环。

于是写了个死循环。。。。死循环总是鬼畜的~

而数据库的连接由于某种鬼畜的原因,不能用jdbc,odbc等api,只能使用linux命令连接,不做深究。

然后本菜鸡写了一个如下的程序。

#define THREAD_NUM 101
void GetProcessId(char* str)
{
        system("mysql -utest -ptest -P33001 -h172.17.xxx.xxx>>connect.res");//ip随意
}
void KillConnect()
{
        system("kill -9 $(ps -ef|grep utest|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')");
}

int main()
{
        while(1){
                pthread_t thread_arr[THREAD_NUM];
                int i=0;
                pthread_create(&thread_arr[i],NULL,(void *)KillConnect,NULL);
                for(i=1;i<THREAD_NUM;i++)
                {
                        pthread_create(&thread_arr[i],NULL,(void *)GetProcessId,NULL);
                }
        }
        return 0;
}

一些代码辣鸡之处不必深究,毕竟只是随便写写的,然后问题来了,在运行一段时间后,程序不死,不崩也不运行,查询进程状态为“无法中断的休眠状态”。

开了各种linux中进程线程的介绍,太多雷同,百度知道中这位大虾很好地解释了中断,然而我依然没联想到该程序的问题。

如果有知道答案的也希望不吝赐教~~

在此做个记录。

编写这样一个Linux嵌入式设备进程崩溃信息记录程序,通常需要以下几个步骤: 1. **异常处理**:首先,你需要设置捕获SIGSEGV(信号段错误,通常是由于内存访问错误导致的进程崩溃)或其他相关的致命信号。可以使用`signal`函数或`sigaction`函数来注册信号处理器。 ```c #include <signal.h> void handle_crash(int signum) { // 当接收到SIGSEGV等信号时会被调用 char *message = "Process has crashed"; // 自定义崩溃信息 write_to_file(message); } int main() { struct sigaction act; act.sa_handler = handle_crash; sigfillset(&act.sa_mask); // 接受所有信号 act.sa_flags = 0; if (sigaction(SIGSEGV, &act, NULL) == -1) { perror("Failed to set signal handler"); return 1; } // ...其他程序初始化... // 开始监控和运行程序 while (1) { /* Your program logic here */ } } ``` 2. **日志记录**:在`handle_crash`函数中,你需要将崩溃信息写入到本地文件。这通常通过`open`, `write`, 和 `fclose`系统调用来实现,或者使用`fstream`库在C++中更方便地操作文件。 ```c++ #include <fstream> ... void write_to_file(char *message) { std::ofstream log_file("/path/to/your/log/file.log", std::ios_base::app); if (!log_file.is_open()) { perror("Failed to open file for writing"); return; } log_file << message << "\n"; log_file.close(); } ``` 3. **定期检查**:为了持续监测并及时记录,你可以将上述异常处理放在一个循环或守护进程中,并定期检查是否有新的崩溃事件。 请注意,在实际项目中,还需要考虑权限、文件锁定、磁盘空间等因素。此外,如果你想要收集更详细的崩溃报告,可以考虑使用第三方工具如gdbserver或者ELF核心转储技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值