2012-05-15 117 views
0

我想同步父進程和子進程,或者將1到10打印到文件中。並輸出哪個進程打印的數字。以下代碼可以選擇打印,但數字相同。請幫助我!同步父和子進程

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <unistd.h> 

#define MSGSIZE 16 
int parent= 1; 
int n=-1; 
main() 
{ 
    int i; 
    char *msg = "How are you?"; 
    char inbuff[MSGSIZE]; 
    int p=0; 
    FILE *fp1,*fp2; 
    pid_t ret; 

    ret = fork(); 
    if (ret > 0) 
    { 
     i = 0; 
     while (i < 10) 
    { 

     n++; 
    // sprintf(msg, "%d", n); 
    // fp=fopen("abc.txt","a"); 
    // write (p[1], itoa(n,msg,MSGSIZE), MSGSIZE); 
    // sleep (2); 
    // fclose(fp); 
     //read (p[0], inbuff, MSGSIZE); 

    fp1=fopen("abc.txt","r"); 
    fscanf(fp1,"%d",&n); 
    fclose(fp1); 
    fp1=fopen("abc.txt","w"); 
    fprintf(fp1,"%d",n); 
    printf("Parent: %d\n", n); 
     i++; 
    fclose(fp1); 
    sleep(2); 

    } 
    exit(1); 
    } 
    else 
    { 
     i = 0; 
     while (i < 10) 
    { 

     n++; 
     //sleep (1); 
    // read (p[0], inbuff, MSGSIZE); 

    fp2=fopen("abc.txt","r"); 
    fscanf(fp2,"%d",&n); 
    fclose(fp2); 
    fp2=fopen("abc.txt","w"); 

    fprintf(fp2,"%d",n);   
     printf("Child: %d\n", n); 
      i++; 

    sleep(2); 

    } 
    } 
    exit (0); 
} 

回答

1

這是因爲進程不共享內存,所以基本上你n是每個進程不同。爲此,您需要使用inter-process-communication,其中Linux提供了幾種方法來做到這一點:

http://tldp.org/LDP/lpg/node7.html

一般來說,你只需要找到一種方法來共享的父母和孩子之間的過程中n值。

注意:對於用戶線程,不會出現此問題,因爲同一進程上的用戶線程共享內存。你只需要同步訪問它。另外,要小心,因爲根據您在進程中使用的方法,您可能還需要同步訪問權限。

0

如果你想改變變量的同一個內存位置,那麼這是不可能的,因爲這兩個進程有不同的地址空間。在線程的情況下,你可以達到同樣的效果。