2013-10-23 43 views
-1

这是一个程序,我希望在父进程和子进程之间实现信号量,这些进程正试图访问一个名为counter的共享变量......我不知道为什么它在子进程中没有增加! !请有人帮忙!父与子进程之间的信号量

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <semaphore.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 
sem_t mutex; 
int counter; 
int main() 
pid_t child_pid; 
sem_init(&mutex, 0, 1); 
printf ("the main program process ID is %d\n", (int) getpid()); 
child_pid = fork(); 
if (child_pid != 0) { 
printf ("This is the parent process, with id %d\n", (int) getpid()); 
printf("Thread 1: Waiting to enter critical region...\n"); 
sem_wait(&mutex); 
printf("Thread 1: Now in critical region...\n"); 
printf("Thread 1: Counter Value: %d\n",counter); 
printf("Thread 1: Incrementing Counter...\n"); 
counter++; 
printf("Thread 1: New Counter Value: %d\n",counter); 
printf("Thread 1: Exiting critical region...\n"); 
sem_post(&mutex);  
} 
else 
{ 
sleep(10); 
printf ("this is the child process, with id %d\n", (int) getpid()); 
sem_wait(&mutex); 
printf("Thread 2: Now in critical region...\n"); 
printf("Thread 2: Counter Value: %d\n",counter); 
printf("Thread 2: Incrementing Counter...\n"); 
counter++; 
printf("Thread 2: New Counter Value: %d\n",counter); 
printf("Thread 2: Exiting critical region...\n"); 
sem_post(&mutex); 
} 
sem_destroy(&mutex); 
return 0; 
} 
+0

我会尝试调试。 – akonsu

+0

好的调试分叉进程是非平凡的... @OP fork创建进程不是线程 – LostBoy

回答

0

首先,您需要在sem_init()调用中为pshared使用非零值。

0

counter不是共享,因为fork()复制整个过程。你正在增加不同的变量。

+0

是啊...我试着传递该计数器变量的地址并通过函数递增...但仍然是相同的结果! –

+0

@Raj是的,整个过程是重复的。 – tommyo

1

您必须创建一个共享内存信号量,否则父母和孩子将拥有自己独立的信号量。