2014-11-03 76 views
0

我正在開發腳本語言以及C API,以便C程序可以與我的語言進行交互。它基於LUA的堆棧方法。然而,我遇到了兩個模塊之間的同步問題......對yyparse()調用執行操作?

在我的API的init函數上,我啓動了一個線程,對系統調用我的解釋器,以便它可以接收命令我想要它執行。我還創建了2個信號量,以便我可以(理論上)將我的API與解釋器模塊同步。我需要按以下順序完成操作:初始化解釋器 - > API發送命令 - >解釋器執行所述命令 - >等待新命令。

這裏的解釋器的主要功能:

int main(int argc, char* argv[]) { 

extern FILE *yyin; 

char *semRead = "/canRead"; 
char *semSend = "/canSend"; 

sem_t *canRead; 
sem_t *canSend; 

//this part is just so that my code will be coming through a pipe 
//created by me, instead of stdin 
if(argc == 1) 
    yyin = stdin; 
else if(argc == 2){ 

    suppress = 1; 

    if(strcmp(argv[1], "-s") == 0){ 

     char *source = "/tmp/colliPipe"; 
     mkfifo(source, 0666); 

     yyin = fopen(source, "w+"); 
    } 
    else{ 
     printf("Error: unknown option %s\n", argv[1]); 
     return -1; 
    } 
} 
else if(argc > 2){ 
    printf("Error: too many parameters\n"); 
    return -2; 
} 
#if YYDEBUG == 1 
    extern int yydebug; 
    yydebug = 1; 
#endif 

initTables(); //Initializing symbol tables 

if(!suppress){ 
    printf("Colli 0.0.1 - 2014"); 
    printf(">> "); 
} 

canRead = sem_open(semRead, O_CREAT, 0644, 0); 
canSend = sem_open(semSend, O_CREAT, 0644, 0); 

sem_post(canSend); 

yyparse(); 

return 0; 
} 

事情是:當我創建我的線程,我不能保證我的解析器將準備接受我的輸入。 sem_post(canSend)用於指示解析器應該準備好獲取所述輸入,但它不起作用,因爲操作系統可以決定在發佈後但在yyparse()之前交換進程。

問題是:我可以確保解析器已準備好在解析之前發佈到信號量?

在此先感謝!

回答

0

如果你想知道我怎麼了,解決它......

剛剛決定創建一個線程調用yyparse(),讓我把sem_post創建後...這似乎工作得很好。