2014-12-03 72 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标志来编译此代码。