标题:linux下进程创建的C语言程序
只看楼主
寂静的天光云影
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-11-20
 问题点数:0 回复次数:8 
linux下进程创建的C语言程序
编写C语言程序,使其完成:父进程创建一个子进程,子进程运行中显示当前系统的记录时钟;父进程运行时完成将1——100循环显示到标准输出流上,同时注意程序运行时控制其执行 顺序是,子进程先运行,父进程再运行。
linux  环境下
想了半天还是 弄不出来
小的 刚入行
望大家 解答下 感激不尽
搜索更多相关主题的帖子: C语言 linux 进程 
2008-11-20 21:27
寂静的天光云影
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-11-20
得分:0 
挖 大家都不在吗?
哎 怪自己C语言没学好啊,真是遗憾的
2008-11-20 21:39
liumang_D
Rank: 2
来 自:计算机
等 级:论坛游民
威 望:1
帖 子:89
专家分:50
注 册:2008-10-20
得分:0 
我看你的题目,有点不太清楚,你能具体举例说说你想看到的结果么?
2008-11-20 22:46
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
得分:0 
要么你vfork,这个是保证子进程先执行的。要么你fork以后主进程waitpid
2008-11-21 00:06
寂静的天光云影
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-11-20
得分:0 
啊?能给出代码参考?
2008-11-23 21:32
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
得分:0 
自己man去
2008-11-24 06:12
josen0205
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:307
专家分:52
注 册:2007-5-8
得分:0 
不知道你的意思我理解了没有,下面是代码,有的东西是多余的(比如程序中设置定时器,和子进程的SIGINT信号处理)都可以不用的,其实只要等到父进程结束,然后向进程组发送SIGINT信号,子进程收到SIGINT信号采用默认的处理就可以了。这样写只是为了把进程的信号处理表达的清晰一些,另外fork()出来的进程执行没有先后顺序,一般都是采用等待的方式让另一个进程先运行。
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <signal.h>
#include <sys/types.h>

void i_xy(int x, int y)
{
    printf("%c%c%d;%dH", '\033', '[', x, y);
}

void o_str(char *str)
{
  /* set output mode unbuffered */
  setvbuf(stdout, (char *)NULL, _IONBF, 0);

  fprintf(stdout, "%s", str);

  /* set output mode default-line buffered */
  setvbuf(stdout, (char *)NULL, _IOLBF, 0);
}

char *gettime()
{
  static char result[16+1];
  time_t t;
  struct tm *lt;

  t =time(NULL);
  lt = (struct tm *)localtime(&t);

  memset(result, 0x00, sizeof(result));

  sprintf(result, "%2.2d:%2.2d:%2.2d", 
           lt->tm_hour, lt->tm_min, lt->tm_sec);

  return result;
}

void sig_int(int signo)
{
  signal(SIGINT, SIG_DFL);
  perror("SIGINT was caught by child, child is stopped\n");
  raise(SIGINT);
}

void sig_alrm(int signo)
{
  perror("SIGALRM was caught by parent, send SIGINT to child\n");
  kill(0, SIGINT);
}

void showtime()
{
  signal(SIGINT, sig_int);
  while(1)
  {
    i_xy(2, 1);
    o_str(gettime());
    sleep(1);
  }
}

int main(int argc, char *argv[])
{
  int i = 0;
  pid_t pid = 0;
  char str[64];

  system("clear");
  i_xy(2,1);

  pid = fork();
  if(pid < 0)
  {
    printf("\nfork child error\n");
    return -1;
  }
  if(pid == 0)
    showtime();

  usleep(1);

 
  /* 设置时钟,如果十秒后程序没有结束,强制停止 */
  alarm(10);
  signal(SIGALRM, sig_alrm);

  for(i = 1; i < 20; i++)
  {
    memset(str, 0x00, sizeof(str));

    sprintf(str, "%d", i);
    i_xy(2 + i, 1);
    o_str(str);

    sleep(1);
  }

 
  kill(0, SIGINT); /* 向进程组发送终止信号 */

  return 0;
}


[[it] 本帖最后由 josen0205 于 2008-11-26 11:44 编辑 [/it]]

只有想不到,没有做不到
2008-11-25 16:37
josen0205
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:307
专家分:52
注 册:2007-5-8
得分:0 
再给你一个多进程的例子:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <time.h>

#define P_ALIVE   0
#define P_STOP    1
#define MAXTIMES  3
#define PROCNUM   3
#define TRUE      0
#define FALSE    -1

struct processcfg{
  int id;              /* 编号     */
  pid_t tPid;          /* 进程id   */
  int tRunTimes;       /* 运行次数 */
  long tStartTime;
  long tEndTime;
  int tStatus;
};

struct processcfg *stProcess = NULL;

int ChildMain(struct processcfg *pstProcess)
{
  while(1)
  {
    if(pstProcess->tRunTimes >= MAXTIMES)
    {
      time(&(pstProcess->tEndTime));
      printf("child process <%d> stop\n", pstProcess->tPid);
      exit(0);
    }
   
    pstProcess->tRunTimes ++;

    printf("i am child <%d> run <%d> times\n",
                   pstProcess->tPid, pstProcess->tRunTimes);

    sleep(1);
  }

  return TRUE;
}

int MakeChild(struct processcfg *pstProcess, int tId)
{
  pid_t pid;
  int status;

  pid = fork();

  if(pid < 0)
  {
    printf("\nfork child error\n");
    return FALSE;
  }
  if(pid == 0)
  {
    pstProcess->id = tId;
    pstProcess->tPid = getpid();
    pstProcess->tRunTimes = 0;
    pstProcess->tStatus = P_ALIVE;
    setpgrp();
    sleep(1);
    ChildMain(pstProcess);
  }
  else
  {
    pstProcess->id = tId;
    pstProcess->tPid = pid;
    pstProcess->tRunTimes = 0;
    pstProcess->tStatus = P_ALIVE;
    time(&(pstProcess->tStartTime));
  }
  return pid;
}

/* 创建进程共享内存结构 */
void *initProcShm(int *id)
{
  int i = 0, shmid;
  FILE *fp = NULL;
  key_t shmkey;
  size_t shmsize;
  struct processcfg *stProcess = NULL;
  void *shmAddr;
  char sFile[256];

  memset(sFile, 0x00, sizeof(sFile));

  strcpy(sFile, "PROCSHM");

  if((fp = fopen(sFile, "a")) == NULL)
  {
    printf("\nopen file <%s> error\n", sFile);
    return NULL;
  }
  fclose(fp);

  shmkey = ftok("PROCSHM", 2);

  shmsize = PROCNUM*sizeof(struct processcfg);

  shmid = shmget(shmkey, shmsize, IPC_CREAT|0666);
  if(shmid < 0)
  {
    printf("\nget share memory error\n");
    return NULL;
  }

  shmAddr = (void *)shmat(shmid, (void *)0, 0);
  if((long)shmAddr == -1)
  {
    printf("\nattach share memory error\n");
    return NULL;
  }
  *id = shmid;
  stProcess = (struct processcfg *)shmAddr;

  for(i = 0; i < PROCNUM; i++)
  {
    memset(stProcess, 0x00, sizeof(struct processcfg));
    stProcess->id = 0;
    stProcess->tPid = 0;
    stProcess->tRunTimes = 0;
    stProcess->tStatus = P_ALIVE;
    stProcess->tStartTime = 0;
    stProcess->tEndTime = 0;

    stProcess ++;
  }

  return shmAddr;
}

int main(int argc, char *argv[])
{
  int i = 0, num = 0, shmid = 0;
  pid_t pid = 0, cpid = 0;
  struct processcfg *pstProcess = NULL;

  pid = fork();

  if(pid < 0)
  {
    printf("fork main err\n");
    return FALSE;
  }

  if(pid == 0)
  {
    printf("main process begin to run\n");
    return TRUE;
  }

  /* get process config share memory */
  stProcess = (struct processcfg *)initProcShm(&shmid);
  if(stProcess == NULL)
    return FALSE;

  num = 0;
  pstProcess = stProcess;
  for(i = 1; i <= PROCNUM; i++)
  {
    memset(pstProcess, 0x00, sizeof(struct processcfg));
    if(MakeChild(pstProcess, num+1) < 0)
      break;
    num ++;
    pstProcess ++;
  }
  printf("\n%d process created ...\n", num);

  /* 检查是否所有子进程都退出 */
  for(;;)
  {
    cpid = 0;
    cpid = wait(NULL); /* wait a child process exit */

    num = 0;
    pstProcess = stProcess;
    for(i = 0; i < PROCNUM; i++)
    {
      /* 当前退出的进程 */
      if(pstProcess->tPid == cpid)
      {
        printf("%d  %d  %d\n",
          pstProcess->tPid, pstProcess->tStartTime, pstProcess->tEndTime);
        pstProcess->tStatus = P_STOP;
      }

      if(pstProcess->tStatus == P_ALIVE)
        num ++;

      pstProcess ++;
    }

    /* 所有子进程都结束,父进程退出 */
    if(num == 0)
      break;
  }
  /* detach share memory */
  shmdt((char *)stProcess);
  
  /* delete share memory */
  shmctl(shmid, IPC_RMID, (struct shmid_ds *)0);

  printf("\nparent process <%s %d> stop\n", argv[0], getpid());

  return TRUE;
}

[[it] 本帖最后由 josen0205 于 2008-11-25 21:48 编辑 [/it]]

只有想不到,没有做不到
2008-11-25 16:48
dream19850911
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-12-1
得分:0 
这个大哥,小弟想请教下如果编程连接到网站的地址,我现在负责做在线视频程序的一小部分,是用linux和C语言编写的,我现在想编程连接到(或是说下载)网站地址,好想需要用到fork,excelp等一些函数,请问可不可以给个例子给我啊,不胜感激!!!
2008-12-01 16:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-245459-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.648114 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved