我道歉,但我的英语,我希望你能明白。 所以我有我的程序中的printf这个问题,等待父亲的结束和一些printf之前。所以我总是得到父亲打印他所有的信息,然后儿子printf他所有的信息,而它应该交叉..错误printf在叉
从我看到的,我读了,我必须有fflush,但它不能解决我的问题。 Thx为您提供帮助。 这是我的代码。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <unistd.h>
#include <sys/shm.h>
int cpt = 0;
void fils(int *cpt){
int i;
for(i = 0; i < 3; i++){
(*cpt)++;
printf("son : %d\n", *cpt);
}
}
void pere(int *cpt){
int i;
for(i = 0; i < 3; i++){
(*cpt)--;
printf("father : %d\n", *cpt);
fflush(stdout);
}
}
int main (int argc, char*argv[]){
key_t key;
int memShared;
int *cpt = NULL;
key = ftok(argv[0],'p');
memShared = shmget(key, sizeof(int), IPC_CREAT|IPC_EXCL|0666);
cpt = shmat (memShared, cpt, 0);
*cpt = 0;
fflush(stdout);
switch (fork()){
case -1: perror("erreur de création du fils");
exit(99);
case 0: fils(cpt);
exit(1);
default: pere(cpt);
wait(NULL);
}
shmctl(memShared, IPC_RMID, NULL);
return 0;
}
和我总是有这样的在终端
父亲:-1 父亲:-1 父亲:-2 子:0 子:-1 子:0
我虽然应该交叉,例如父亲:-1儿子:0父亲:-1 ... 感谢您的帮助。
你说“它应该交叉”,但你没有实现这样做的机制。这两个过程都只是为了写出所有的输出,你的程序中没有任何东西可以让你等待另一个。如果你想让他们交替输出,你必须编写代码让他们做到这一点。你也不会同步对共享内存的访问,这就是为什么你会得到奇数输出,比如父亲连续写两个'-1'。 – 2014-10-19 19:17:28
您总是需要将'fork'的结果保存在一个变量中,因为父亲需要'waitpid'。另请参阅[shm_overview(7)](http://man7.org/linux/man-pages/man7/shm_overview.7.html)和[sem_overview(7)](http://man7.org/linux/man -pages/man7/sem_overview.7.html) – 2014-10-19 19:17:38
@BasileStarynkevitch:不需要。他正在等待任何一个子进程完成。这足够有选择性。 (我们不是在一般情况下,真正必须使用'waitpid'。) – Deduplicator 2014-10-19 19:21:44