LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 670|回复: 4

进程间通信问题

[复制链接]
发表于 2006-4-9 11:37:35 | 显示全部楼层 |阅读模式
:help
求一段进程交互的代码, 给伪码也行
其实满基础的, 用fork或execl等都可以吧
:ask

开10个进程, 分别执行func01(), func02(), ... func10(),
分别return ret01, ret02, ... ret10
等十个都跑完了后, 再将ret01, ... ret10相加,
相加的结果作为最终返回值
发表于 2006-4-9 14:35:41 | 显示全部楼层
homework? plz read some book like "Advanced Programming in the Unix Environment"
回复 支持 反对

使用道具 举报

发表于 2006-4-9 15:51:36 | 显示全部楼层
进程间通讯的关键不是fork、execl吧,莫名中。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-10 20:23:35 | 显示全部楼层
差不多是homework级别的东东, 但不是homework
就是进程间通信不会阿...
那关键是啥?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-12 21:21:25 | 显示全部楼层
我写了段代码, 但不知道怎么锁文件, 用fcntl和semaphore都试了, 都有问题
大侠们帮帮忙啊...


/////////////////////
// test1.c
// gcc -o test1 test1.c
// ./test1
//////////////////////////////////////
/// how to lock file when writing? ///
//////////////////////////////////////

#include <unistd.h>
#include <stdio.h>
#include <sys/fcntl.h>
#include <sys/wait.h>
#define NPID 10

/////????????????
int mklock ()
{
  // i don't know how to implement that...
  return 0;
}

/////?????????????
int unlock ()
{
  // i don't know how to implement that...
  return 0;
}

int DoSth (int a)
{
  printf ("%ld is doing!!\n", getpid());
  sleep (1);
  return a*a;
}

int SaveToFile (char *filename, int nResult)
{
  int fd;
  char buf[10];
  FILE *fp;
  if ((fp = fopen(filename, "a")) == NULL) {
    printf ("fopen %s for append error\n", filename);
    return -1;
  }
  fprintf (fp, "%d ", nResult);
  fclose(fp);
  return 0;
}

int FileToArray(char *filename, int *arr)
{
  int nResult;
  int nCnt = 0;
  FILE *fp;
  if ((fp = fopen(filename, "r")) == NULL) {
    printf ("fopen %s for read error\n", filename);
    return -1;
  }
  while (!feof(fp)) {
    fscanf (fp, "%d ", &nResult);
    arr[nCnt] = nResult;
    nCnt++;
    printf ("%d ", nResult);
  }
  fclose(fp);
  return 0;
}

int main ()
{
  pid_t pid1;
  int n1, i;
  char filename[10];
  int nArr[NPID];
  FILE *fp;
  int status;

  sprintf (filename, "%ld.file", getpid());
  printf ("%s created!!\n", filename);
  if ((fp = fopen(filename, "w")) == NULL) {
    printf ("create %s error\n", filename);
    return -1;
  }
  fclose (fp);

  for (i=0; i<NPID; i++) {
    if ( (pid1 = fork()) < 0)
      return -1;
    if (pid1 == 0) {
      pid1 = getpid();
      n1 = DoSth (36+i);
      //////////????????///////////////////////////
      mklock();
      SaveToFile(filename, n1);
      unlock();
      //////////????????//////////////////////////
      return 0;
    }
  }
  wait (&status);
  sleep (1);
  FileToArray(filename, nArr);
  printf("================ %ld ==============\n", getpid());

  for (i=0, n1=0; i<NPID; i++) {
    n1 += nArr;
    printf ("pid[%d] = %d\n", i, nArr);
  }
  printf ("total = %d\n", n1);
  return 0;
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表