2014-12-08 20 views
-1

我正在尝试创建一个程序,它让子进程休眠几秒钟,然后释放正在等待的父进程的信号量。我花了几天的时间阅读信号量和在线研究,但都很混乱。另外,每个例子都是一些看起来很简单的代码,每个代码都完全不同。试图用信号量做一个简单的程序

编辑:DERP!所以,代码不起作用。孩子(分)很好,但父母永远卡在sem_wait上。所以我在实现信号量方面似乎出了问题。

这是我到目前为止有:

#include <semaphore.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int j, dummy, intCast; 
    sem_t s; 

    if (argc < 2 || strcmp(argv[1], "--help") == 0){ 
     printf("Usage: sem_sync X (X is one or more ints)"); 
     exit(EXIT_FAILURE); 
    } 

    setbuf(stdout, NULL); /* Make stdout unbuffered, since we 
              terminate child with _exit() */ 
    printf(" Parent started\n"); 

    sem_init(&s, 0, 0); 
    for (j = 1; j < argc; j++) { 
     switch (fork()) { 
     case -1: 
      printf("Error on fork %d", j); 
      exit(EXIT_FAILURE); 

     case 0: /* Child */ 
      intCast = atoi(argv[j]); // Casts the argument into an integer 
      printf("Child sleeping for %d seconds\n",intCast); 
      sleep(intCast); 
      sem_post(&s); 
      _exit(EXIT_SUCCESS); 

     default: /* Parent loops to create next child */ 
      break; 
     } 
    } 
    printf(" Parent is waiting\n"); 
    sem_wait(&s); 
    printf(" Parent ready to go\n"); 
    exit(EXIT_SUCCESS); 
} 

这里的工作代码sem_open()和sem_close()

int main(int argc, char *argv[]) 
{ 
    int j, intCast; 
    sem_t *s; 

    printf(" Parent started\n"); 
    s = sem_open("file1", O_CREAT, 0600, 0); 
    if (s == SEM_FAILED){ 
     printf("sem_open() failed. errno:\n"); 
    } 

    for (j = 1; j < argc; j++) { 
     switch (fork()) { 
     case -1: 
      printf("Error on fork %d", j); 
      exit(EXIT_FAILURE); 
     case 0: /* Child */ 
      intCast = atoi(argv[j]); 
      printf("Child sleeping for %d seconds\n",intCast); 
      sleep(intCast); 
      sem_post(s); 
      _exit(EXIT_SUCCESS); 
     default: 
      break; 
     } 
    } 
    printf(" Parent is waiting\n"); 
    for (j = 1; j < argc; j++){ 
     sem_wait(s); 
    } 
    sem_close(s); 
    exit(EXIT_SUCCESS); 
} 
+0

那么这段代码有什么问题?这段代码对你来说似乎很长吗? – 2014-12-08 06:49:08

+0

如果您提供问题会更有用,因为代码的长度似乎不是一个值得关注的问题。 – OshoParth 2014-12-08 06:54:23

+0

对不起!我编辑了这篇文章,指出了代码的问题。 – Sidreal 2014-12-08 06:58:10

回答

1

使用sem_open(),而不是sem_init()。除非您在共享内存中创建这些信号,否则您使用sem_init()创建的信号不会在进程间共享。只需使用sem_open()即可完成您正在尝试的操作,这更容易。

编辑:请记住,sem_open()将创建一个持久的信号量,您需要使用sem_unlink()删除。如果有可能是一个流浪的文件从以前的调用躺在身边,你可能希望你打开它像在此之前断开链接的文件:

sem_unlink(filename); 
sem_open(filename, O_CREAT, etc...); 

,让你删除的命名信号灯打开它之前。否则,如果它已经存在,则sem_open将打开现有的信号量并继承信号量中已有的计数。

+0

好的,所以我改变了我的代码来使用sem_open(),现在我遇到了相反的问题。在子进程有机会sem_post()之前,父进程会醒来。 – Sidreal 2014-12-08 07:52:13

+0

你可以显示新的代码吗? – JS1 2014-12-08 10:39:52

+0

评论空间不足,我会编辑我原来的帖子。在切换到sem_open()之后,它的行为很奇怪,因为我没有sem_close(),信号量将通过多次执行保留。 – Sidreal 2014-12-09 21:56:52

相关问题