C-使用pthread和信号打印文本文件



我有以下代码

typedef struct 
{
    char word[64];
} DataStructure;
sigset_t set;
FILE *pFile;
static void *print(void *ptr)
{
    char *message;
    message = (char *)ptr;
    int sig;
    while(!feof(pFile))
    {
        sigwait(&set, &sig);
        printf("%s n", message);
        sleep(2);
    }
    return 0;
}
int main(int argc, char *argv[])
{
    DataStructure Data;
    sigemptyset(&set);
    sigaddset(&set, SIGUSR1);
    pthread_sigmask(SIG_BLOCK, &set, NULL);
    pthread_t thread;
    pthread_create(&thread, NULL, print, (void *)Data.word);
    pFile = fopen("rhyme1.txt", "r");
    while(!feof(pFile))
    {
        fscanf(pFile, "%s", Data.word);
        pthread_kill(thread, SIGUSR1);  
    }
    pthread_join(thread, NULL);
    pthread_exit(NULL);
}
/*The output should look like:
Hickory,
dickory,
dock,
The
mouse
ran 
up
the
clock.
This code results in:
clock. */

我试图打开一个文本文件,并使用SCANF在行上的每个单词中读取。然后将单词发送到"打印"方法(通过pthread_create的参数),并在发送信号时(通过pthread_kill)打印读取的单词。该过程重复进行,直到文件被完全读取并打印为止。

正是鸭的建议。

您可以做的是使用一个线程进行阅读和一个用于打印的线程,每个线程彼此发出信号以保持同步:

static void *print(void *ptr)
{
    char *message = (char *)ptr;
    int sig;
    while(!feof(pFile))
    {
        sigwait(&set, &sig);
        printf("%sn", message);
        pthread_kill(thread2, SIGUSR1);  
    }

    return 0;
}
static void *readstr(void *ptr)
{
    char *message = (char *)ptr;
    int sig;
    while(!feof(pFile))
    {
        fscanf(pFile, "%s", message);
        pthread_kill(thread1, SIGUSR1);  
        sigwait(&set, &sig);
    }
    return 0;
}

它会导致"时钟",因为您正在将指针传递到数据。单词将在线程中运行的循环之前多次覆盖。"时钟"只是发生在该内存位置的最后一件事。

while(!feof(pFile))
{
    fscanf(pFile, "%s", Data.word);
    pthread_kill(thread, SIGUSR1);  
}

上面将快速浏览文件,可能是在线程执行之前,肯定在2秒睡眠结束之前。

while(!feof(pFile))
{
    sigwait(&set, &sig);
    printf("%s n", message);
    sleep(2);
}

您可能会在随后的运行中获得不同的结果,但我怀疑您会期望的。信号不会排队。

最新更新