2014-12-03 58 views
0

在一些exemples我沒有看到,他們使用線程爲 ,但我想只用叉子和1個私人旗語專用信號燈在C

我想要做一些簡單的這樣做:

#include<stdio.h> 
#include<stdlib.h> 
#include<unistd.h> 
#include<sys/types.h> 
#include<semaphore.h> 

int main() { 
    pid_t pid; 
    sem_t sema; 
    sem_init(&sema,1,0); 
    pid=fork(); 
    if(pid==0) { 
     printf("first"); // want this first 
     sem_post(&sema); 
    }else{ 
     sem_wait(&sema); 
     printf("second -_-");// and that second 
    } 
    return 0; 
} 

///////////////////////////////////

GCC pgm.c -pthread 。 /a.out

///////////////////// //////////////

輸出: 第一

//////////////////////// //////////

所以最新的問題在這裏?我希望它=>

第一第二-_-

回答

0

創建除非你在共享存儲器中創建它(即使你爲pshared通過1)不跨越進程共享的信號量。要做你想做的事情,你需要先創建共享內存。閱讀關於shmgetshmat

請注意,如果您使用的線程而不是fork,您的線程將共享相同的內存,然後代碼將工作。但是因爲您使用了fork,您創建了一個不再與父進程共享相同內存的新進程。

+0

或使用現代接口'shm_open',這是一個更簡單的使用 – 2014-12-03 21:03:31

0

如果您使用的是semaphore.h,那麼您必須將您的信號置於共享內存中以在不同的進程中使用它們。如果你不想使用共享內存,你總是可以在sys/sem.h中使用信號量。

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/sem.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 

/* Required for semctl() */ 
union semun { 
    int val; 
    struct semid_ds *buf; 
    unsigned short *array; 
    struct seminfo *__buf; 
}; 

int main() 
{ 
    pid_t pid; 

    /* VARIABLES FOR SEMAPHORE */ 
    int sem_id; 
    union semun sem_arg; 
    unsigned short sem_value[1] = {0}; /* initial value of semaphore will be 0 */ 
    struct sembuf sem_buf; 
    /* END OF VARIABLES FOR SEMAPHORE */ 

    /* CREATE SHARED SEMAPHORE */ 
    sem_arg.array = sem_value; 
    sem_id = semget(IPC_PRIVATE, 1, SHM_R | SHM_W); 
    semctl(sem_id, 0, SETALL, sem_arg); 
    /* END OF CREATE */ 

    pid=fork(); 

    if(pid==0) { 
     printf("first"); // want this first 

     /* UNLOCK SEMAPHORE */ 
     sem_buf.sem_num = 0; 
     sem_buf.sem_op = 1; 
     sem_buf.sem_flg = 0; 
     semop(sem_id, &sem_buf, 1); 
     /* END OF UNLOCK */ 
    }else { 
     /* LOCK SEMAPHORE */ 
     sem_buf.sem_num = 0; 
     sem_buf.sem_op = -1; 
     sem_buf.sem_flg = 0; 
     semop(sem_id, &sem_buf, 1); 
     /* END OF LOCK */ 

     printf("second -_-"); // and that second 
    } 

    /* Remove semaphore */ 
    semctl(sem_id, 0, IPC_RMID, NULL); 
    return 0; 
} 

它看起來更復雜,但您可以定義功能的鎖定和解鎖的部分,並呼籲他們不是每次都寫同樣的4行代碼,你的:我已經使用SYS/sem.h中實現如下的例子想要鎖定/解鎖您的流程。

注意:您不需要-lpthread標誌來編譯此代碼。