我正面临着一个同步问题,我正在尝试解决的问题包括将字符串从父节点发送到子节点,将其反转并将其发送回子节点(使用共享内存).
然而,为了确保孩子在等待父母我使用sleep(3)给3秒到父进程进入串,然而这限制我的程序的效率,我不想强迫用户等待3秒.
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <sys/wait.h> /* Needed for the wait function */
#include <unistd.h> /* needed for the fork function */
#include <string.h> /* needed for the strcat function */
#define SHMSIZE 27
int main() {
int shmid;
char *shm;
if(fork() == 0) {
sleep(3);
shmid = shmget(29009, SHMSIZE, 0);
shm = shmat(shmid, 0, 0);
printf ("Child : Reading %s \n",shm) ;
int len=strlen(shm);
char rev[100],temp;
int i = 0;
int j = strlen(shm) - 2;
while (i < j) {
temp = shm[i];
shm[i] = shm[j];
shm[j] = temp;
i++;
j--;
}
shmdt(shm);
}else {
shmid = shmget(29009, SHMSIZE, 0666 | IPC_CREAT);
shm = shmat(shmid, 0, 0);
printf("Parent : Enter String \n ");
char *s = (char *) shm;
*s = '\0';
char a[100];
fgets(a,100,stdin);
strcat(s,a);
printf ("Parent: sending %s \n",shm);
sleep(3);
printf("Parent: receiving %s" ,shm);
shmdt(shm);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我建议使用信号量,这不是你使用'sleep'的情况:http: //man7.org/linux/man-pages/man7/sem_overview.7.html
您可以像在此示例中一样使用它们:http: //www.csc.villanova.edu/~mdamian/threads/posixsem.html
你无法确定它不会超过3秒,所以睡眠是一个非常糟糕的选择.所以,它是这样的:
#include <stdio.h>
#include <semaphore.h>
int main(void)
{
sem_t *sem = mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS, -1, 0);
sem_init(sem, 1, 1);
if(fork() == 0) {
printf("Child: Waiting to acquire semaphore\n");
sem_wait(sem);
printf("Child acquires lock\n");
/* do whatever you want then relese*/
sem_post(sem);
} else {
printf("Parent: Waiting to acquire semaphore\n");
sem_wait(sem);
printf("Parent acquires lock\n");
/* do whatever you want then relese*/
sem_post(sem);
}
sem_destroy(sem);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
哦,如果你想让它父母一直跟着孩子(或者反之),你可以使用两个信号量,并相应地初始化它们(用1和0,或0和1).
sem_wait(sem1);
printf("Parent acquires lock\n");
/* do whatever you want then relese*/
sem_post(sem2);
/* Other things will be happening here */
sem_wait(sem2);
printf("Child acquires lock\n");
/* do whatever you want then relese*/
sem_post(sem1);
Run Code Online (Sandbox Code Playgroud)
编辑
如果您不必使用共享内存,最好与套接字进行通信.