sem_t mutex;
int i;
sem_init(&mutex,1,1);
if(0==fork()){
sem_wait(mutex);
for(i=0;i<10000;i++){
/*写字符串"I am child" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
}
sem_wait(mutex);
for(i=0;i<1000;i++){
/*写字符串"I am parent" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
执行完程序打开 xxx 文件查看写入情况,结果 "I am child" 和 "I am parent" 交替被写入,是不是
12 个解决方案
#1
你的
sem_wait(mutex);
for(i=0;i<1000;i++){
/*写字符串"I am parent" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
相当于父子进程都执行了
应该放在条件判断 fork() > 0 里面吧
刚学LINUX
仅供参考
sem_wait(mutex);
for(i=0;i<1000;i++){
/*写字符串"I am parent" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
相当于父子进程都执行了
应该放在条件判断 fork() > 0 里面吧
刚学LINUX
仅供参考
#2
用个变量接收一下fork的返回值
然后对返回值进行判断
分别写入父子进程的代码
然后对返回值进行判断
分别写入父子进程的代码
#3
赞成1楼的,你应该先把/*写字符串"I am parent" 到文件 xxx */写道fork() > 0里面
还有sem_wait是进程里面用的吗?我对这些也不熟悉,只是觉得以前看进程那块的时候没看到,线程里面倒是见过。
还有sem_wait是进程里面用的吗?我对这些也不熟悉,只是觉得以前看进程那块的时候没看到,线程里面倒是见过。
#4
sem_t mutex;
int i;
sem_init(&mutex,1,1);
if(0==fork()){
sem_wait(mutex);
for(i=0;i<10000;i++){
/*写字符串"I am child" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
exit(0);
}
sem_wait(mutex);
for(i=0;i<1000;i++){
/*写字符串"I am parent" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
发帖的时候少了个 exit(0);(效果应该和 把父进程里执行的代码放入 fork()>0 一样的), 问题还是找不到
#5
咋红色标记都不显示,郁闷
#6
sem_t mutex;
int i;
sem_init(&mutex,1,1);
if(0==fork()){
sem_wait(mutex);
for(i=0;i<10000;i++){
/*写字符串"I am child" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
exit(0);
}
sem_wait(mutex);
for(i=0;i<1000;i++){
/*写字符串"I am parent" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
#7
如果希望信号灯在进程之间共享,信号灯本身应该放入共享内存吧
#8
7楼大虾能详细点吗
#9
我认为在初始化函数 sem_init((sem_t *__sem, int __pshared, unsigned int __value)) 中第二个参数 pshared 设为1 就是共享了呀
#10
问题解决了,用无名信号量还是不行 ,我用了有名信号量 sem_open();
#11
无名信号量必须是多个进程(线程)的共享变量,无名信号量要保护的变量也必须是多个进程(线程)的共享变量。
http://wenku.baidu.com/view/378670c20c22590102029d8d.html
百度文库里第3页
五.POSIX信号量详解
1.无名信号量
里面有讲的
一种解决方法是 把那个 无名信号量 存在 共享内存 中 就可以了
http://wenku.baidu.com/view/378670c20c22590102029d8d.html
百度文库里第3页
五.POSIX信号量详解
1.无名信号量
里面有讲的
一种解决方法是 把那个 无名信号量 存在 共享内存 中 就可以了
#12
sem_wait(sem_t *);
sem_post(sem_t *);
这2个函数用法是不对的,你用的是sem_wait(sem) 这是对变量sem本身的拷贝并非原来的sem只是指相同了,之后调用sem_wait()和sem_post()出现的结果是未定义的。我觉得你是吧参数给弄错类型了,应该写成sem_wait(&sem); sem_post(&sem);
sem_post(sem_t *);
这2个函数用法是不对的,你用的是sem_wait(sem) 这是对变量sem本身的拷贝并非原来的sem只是指相同了,之后调用sem_wait()和sem_post()出现的结果是未定义的。我觉得你是吧参数给弄错类型了,应该写成sem_wait(&sem); sem_post(&sem);
#1
你的
sem_wait(mutex);
for(i=0;i<1000;i++){
/*写字符串"I am parent" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
相当于父子进程都执行了
应该放在条件判断 fork() > 0 里面吧
刚学LINUX
仅供参考
sem_wait(mutex);
for(i=0;i<1000;i++){
/*写字符串"I am parent" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
相当于父子进程都执行了
应该放在条件判断 fork() > 0 里面吧
刚学LINUX
仅供参考
#2
用个变量接收一下fork的返回值
然后对返回值进行判断
分别写入父子进程的代码
然后对返回值进行判断
分别写入父子进程的代码
#3
赞成1楼的,你应该先把/*写字符串"I am parent" 到文件 xxx */写道fork() > 0里面
还有sem_wait是进程里面用的吗?我对这些也不熟悉,只是觉得以前看进程那块的时候没看到,线程里面倒是见过。
还有sem_wait是进程里面用的吗?我对这些也不熟悉,只是觉得以前看进程那块的时候没看到,线程里面倒是见过。
#4
sem_t mutex;
int i;
sem_init(&mutex,1,1);
if(0==fork()){
sem_wait(mutex);
for(i=0;i<10000;i++){
/*写字符串"I am child" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
exit(0);
}
sem_wait(mutex);
for(i=0;i<1000;i++){
/*写字符串"I am parent" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
发帖的时候少了个 exit(0);(效果应该和 把父进程里执行的代码放入 fork()>0 一样的), 问题还是找不到
#5
咋红色标记都不显示,郁闷
#6
sem_t mutex;
int i;
sem_init(&mutex,1,1);
if(0==fork()){
sem_wait(mutex);
for(i=0;i<10000;i++){
/*写字符串"I am child" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
exit(0);
}
sem_wait(mutex);
for(i=0;i<1000;i++){
/*写字符串"I am parent" 到文件 xxx */
usleep(10000);
}
sem_post(mutex);
#7
如果希望信号灯在进程之间共享,信号灯本身应该放入共享内存吧
#8
7楼大虾能详细点吗
#9
我认为在初始化函数 sem_init((sem_t *__sem, int __pshared, unsigned int __value)) 中第二个参数 pshared 设为1 就是共享了呀
#10
问题解决了,用无名信号量还是不行 ,我用了有名信号量 sem_open();
#11
无名信号量必须是多个进程(线程)的共享变量,无名信号量要保护的变量也必须是多个进程(线程)的共享变量。
http://wenku.baidu.com/view/378670c20c22590102029d8d.html
百度文库里第3页
五.POSIX信号量详解
1.无名信号量
里面有讲的
一种解决方法是 把那个 无名信号量 存在 共享内存 中 就可以了
http://wenku.baidu.com/view/378670c20c22590102029d8d.html
百度文库里第3页
五.POSIX信号量详解
1.无名信号量
里面有讲的
一种解决方法是 把那个 无名信号量 存在 共享内存 中 就可以了
#12
sem_wait(sem_t *);
sem_post(sem_t *);
这2个函数用法是不对的,你用的是sem_wait(sem) 这是对变量sem本身的拷贝并非原来的sem只是指相同了,之后调用sem_wait()和sem_post()出现的结果是未定义的。我觉得你是吧参数给弄错类型了,应该写成sem_wait(&sem); sem_post(&sem);
sem_post(sem_t *);
这2个函数用法是不对的,你用的是sem_wait(sem) 这是对变量sem本身的拷贝并非原来的sem只是指相同了,之后调用sem_wait()和sem_post()出现的结果是未定义的。我觉得你是吧参数给弄错类型了,应该写成sem_wait(&sem); sem_post(&sem);