0

我知道通常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异常情况告诉我的内容?

4

0 回答 0