我有什么选择反对sleep()同步父进程和子进程之间的传输?

Don*_*one 3 c shared-memory

我正面临着一个同步问题,我正在尝试解决的问题包括将字符串从父节点发送到子节点,将其反转并将其发送回子节点(使用共享内存).

然而,为了确保孩子在等待父母我使用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)

题:

  1. 如何以更好的方式实施,以便程序更有效?

Iri*_*ram 5

我建议使用信号量,这不是你使用'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)

编辑

如果您不必使用共享内存,最好与套接字进行通信.