0

次のプログラムでは、SIGINT シグナルが到着すると、スレッドが直接終了する理由がわかりません (シグナル ハンドラーによってカバーされていない場合でも)。main()ただし、これはプロセスでは発生しません。

シグナルハンドラ:

volatile sig_atomic_t termina = 0;
static void sigHandler()
{
    termina = 1;
}

スレッド機能:

static void *clientFun(void *fdSkt_comF)
{
    int fdSkt_com = *((int *) fdSkt_comF);
    char buffer[DIM_BUFFER];
    memset(buffer, '\0', DIM_BUFFER);

    //"termina" is set to 1 by the signal handler when a signal arrives
    while (termina == 0)
    {
        int lenghtRead;
        RETURN_SYSCALL(lenghtRead, read(fdSkt_com, buffer, DIM_BUFFER), "Errore: read(fdSkt_com, buffer, DIM_BUFFER)")

        if(lenghtRead == 0)
            break;

        //lenghtRead conta tutti i caretteri letti (compreso il '\0' se è presente)
        for(int i = 0; i < lenghtRead-1; i++)
        {
            buffer[i] = toupper((unsigned char) buffer[i]);
        }

        SYSCALL(writen(fdSkt_com, buffer, lenghtRead), "writen(fdSkt_com, buffer, lengthBuffer)")
    }
    puts("Ciao");
    return NULL;
}

どこ:

#define RETURN_SYSCALL(r,c,e) if((r=c)==-1) { perror(e);exit(errno); }
#define SYSCALL(c,e) if(c==-1) { perror(e);exit(errno);}

スレッドの作成と切り離し:

pthread_t clientId;
THREAD_CREATE(&clientId, NULL, &clientFun, (void *) &fdSkt_com, "Thread setId")
SYSCALL_ZERO(pthread_detach(clientId) , "pthread_detach(&clientId)");

すべてのコードを確認したい場合: server.c: https://pastebin.com/6BQA3mx6

client.c: https://pastebin.com/e42hKPxj

utils.h: https://pastebin.com/hLbySeFF

conn.h: https://pastebin.com/fL5cMxcg

4

0 に答える 0