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

时间:2012-11-01 01:33:01

标签: c file pthreads signals posix

我有以下代码

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读取该行中的每个单词。然后将该字发送到'print'方法(通过pthread_create的参数),并在发送信号时(通过pthread_kill)打印读入的字。重复该过程,直到文件完全读入并打印。

2 个答案:

答案 0 :(得分:2)

鸭子建议的确切。

你可以做的是使用一个线程进行读取,一个用于打印,其中每个信号互相依旧以保持同步:

static void *print(void *ptr)
{
    char *message = (char *)ptr;
    int sig;

    while(!feof(pFile))
    {
        sigwait(&set, &sig);
        printf("%s\n", 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;
}

答案 1 :(得分:0)

它会产生“时钟”,因为您正在传递一个指向Data.word的指针,该指针将在线程中的循环运行之前多次重写。 “时钟”恰好发生在该内存位置的最后一件事。

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);
}

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