我知道通常S33E异常终止被忽略,因为它们一直在发生,但我仍然认为它们很混乱,所以我试图让我的 C 语言程序在这方面干净地结束。我确实有一些线程没有明确结束,只是在主程序结束时结束,但我已经清理了它们,我使用PTHREAD_QUERY(via BPX4PTQ) 来发现我是否还有任何线程仍在运行。它说我现在有零线程。dbx此外,如果我在程序结束前在调试器 ( ) 中停止它,则唯一的活动线程是主线程。
我创建了一个非常简单的程序,如下所示,这甚至会导致 S33E 防滑陷阱触发。
#pragma runopts(POSIX(ON))
#define _POSIX_SOURCE
#define _OPEN_THREADS
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void * MyThread(void * arg)
{
printf("Entered MyThread routine\n");
}
int main()
{
pthread_t tid;
void * ret;
if (pthread_create(&tid, NULL, MyThread, NULL))
{
perror("pthread_create error");
}
if (pthread_join(tid, &ret))
{
perror("pthread_join error");
}
//if (pthread_detach(&tid))
//{
// perror("pthread_detach error");
//}
return(0);
}
我删除了对的调用,pthread_detach因为我发现pthread_join(等待线程结束)也将其分离 - 在手册中也是如此。
我将程序作为启动任务运行。当它结束时,S33E 异常止滑陷阱会触发。这只发生在我将程序作为启动任务运行时。
因此,我尝试了一个更简单的程序:-
#pragma runopts(POSIX(ON))
#include <stdlib.h>
int main()
{
printf("A very simple program\n");
return(0);
}
并将其作为启动任务运行,即使是没有创建线程的这个,也会导致 S33E abend slip trap 触发。
那么我还能做些什么来摆脱S33E异常结束呢?
目前 S33E 上的滑动设置为 ACTION=NODUMP。如果我将其更改为转储,我应该寻找什么来发现尚未结束的线程?如果我没有创建线程,这意味着什么?
还是我误解了S33E异常情况告诉我的内容?