2016-11-16 81 views
1

我試圖學習信號量以及它們如何在進程之間工作,所以我想創建一個程序,從兩個單獨的for()循環打印10次字符串「abcd」。一個for()包含「ab」字符串,另一個包含「cd」字符串。我認爲代碼很好,但顯然不是。如果您能指出任何錯誤或我被誤解了,我將不勝感激。POSIX信號量之間的兒童和父母進程

下面的代碼:

int main(void) 
{ 

int i; 
char *p; 
sem_t *sem; //First semaphore 
sem_t *sem2; //Second semaphore 

//create, initialize semaphores 
sem = sem_open("/semaphore1", O_CREAT, 0644, 1); 
sem2 = sem_open("/semaphore2", O_CREAT, 0644, 1); 

if (fork()) //Child process 
{ 
    for (i=0;i<10;i++) 
    { 
     sem_wait(sem2); //Lock the semaphore 
     for (p="ab"; *p; p++) 
     { 
      write(1, p, 1); 
      usleep(100); 
     } 
     sem_post(sem); //Release the semaphore lock 
    } 
    wait(NULL); 
} 
else //Parent process 
{ 
    for (i=0;i<10;i++) 
    { 
     sem_wait(sem); //Lock the semaphore 
     for (p="cd\n"; *p; p++) 
     { 
      write(1, p, 1); 
      usleep(100); 
     } 
     sem_post(sem2); //Release the semaphore lock 
    } 
} 

//Close the Semaphores 
sem_close(sem); 
sem_unlink("/semaphore1"); 
sem_close(sem2); 
sem_unlink("/semaphore2"); 
return 0; 
} 

而且輸出之一:

abcd 
cadb 
cadb 
cadb 
cabd 
cabd 
cabd 
cadb 
cabd 
cadb 
+0

需要初始化的信號量的一個零,而不是都與一個。 –

+0

@JonathanLeffler謝謝!這非常有幫助! –

回答

1

正如評論指出的那樣,你需要初始化第一旗語(改名sem1爲對稱的sem2代碼如下)到0而不是1,這樣父進程就會先到達。

孩子和父母的過程評論錯位(父母從fork()獲得非零結果,因此在if中有效)。即使沒有任何對usleep()的調用,該版本也能產生所需的輸出。名義上,只有一個進程需要使用sem_close()sem_unlink(),但由於您不檢查或報告任何錯誤,因此您不會注意到失敗的調用。

#include <stdio.h> 
#include <semaphore.h> 
#include <unistd.h> 
#include <sys/wait.h> 

int main(void) 
{ 
    int i; 
    char *p; 
    sem_t *sem1; // First semaphore 
    sem_t *sem2; // Second semaphore 

    // create, initialize semaphores 
    sem1 = sem_open("/semaphore1", O_CREAT, 0644, 0); 
    sem2 = sem_open("/semaphore2", O_CREAT, 0644, 1); 

    if (fork()) // Parent process 
    { 
     for (i = 0; i < 10; i++) 
     { 
      sem_wait(sem2); // Lock the semaphore 
      for (p = "ab"; *p; p++) 
      { 
       write(1, p, 1); 
       //usleep(100); 
      } 
      sem_post(sem1); // Release the semaphore lock 
     } 
     wait(NULL); 
    } 
    else // Child process 
    { 
     for (i = 0; i < 10; i++) 
     { 
      sem_wait(sem1); // Lock the semaphore 
      for (p = "cd\n"; *p; p++) 
      { 
       write(1, p, 1); 
       //usleep(100); 
      } 
      sem_post(sem2); // Release the semaphore lock 
     } 
    } 

    // Close the Semaphores 
    sem_close(sem1); 
    sem_unlink("/semaphore1"); 
    sem_close(sem2); 
    sem_unlink("/semaphore2"); 
    return 0; 
} 

輸出示例:

abcd 
abcd 
abcd 
abcd 
abcd 
abcd 
abcd 
abcd 
abcd 
abcd 
+0

這就是我一直在尋找的答案! –