LinuxSir.cn,穿越时空的Linuxsir!

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

一个奇怪的"打摆子"现象

[复制链接]
发表于 2006-6-20 15:06:26 | 显示全部楼层 |阅读模式
写了2个小程序,相互间靠信号量通信,原意是a输出一行行+, b在收到a发送的信号后输出随机个数的*,但目前发现一个怪现象,有时候b能输出,有时候又不见b的输出,奇怪之余,发到论坛上请个位兄弟看看,帮我解开这个迷题,谢谢!
另外我想问一下,exec系列函数到底该用那一个?我怀疑问题在于$PATH变量,哪个exec函数可以带路径的呢?比如 execlp("./b", "b", NULL),可以指定b所在的路径吗?
[php]
a.c
#include <stdio.h>
#include <signal.h>

int main()
{
   int pid, i, j;
   pid = fork();
   if (pid == 0)
      execlp("b", "b", NULL);
   else
   {
     for (i = 0; i < 10; i++) {
       for (j = 0; j < i; j++)
           putchar('+');
       putchar('\n');

       kill(pid, SIGUSR1);
       sleep( 2 );
     }
       kill( pid, 9 );
   }
}
[/php]

[php]
b.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/time.h>

int main()
{
    void proc(int);
    sigset(SIGUSR1, proc);
    while(1) {
        putchar('%');
        sleep( 2 );
    }
}

void proc(int signo)
{
    int i, r;
    srand((unsigned)time(NULL));
    r = rand() % 80;
    putchar('\n');
    for (i = 0; i < r;   i++)
         putchar('*');
    putchar('\n');
    sigset( SIGUSR1, proc );
}
[/php]
发表于 2006-6-20 20:17:50 | 显示全部楼层
execl;execv;execle;execve;execlp;execvp;
前四个带路径;后两个带名字,在$PATH中寻找;

a中好象父进程变成了b,子程为a。
kill(pid, SIGUSR1)是不是给a发了信号,b根本没有接受到任何信号?
回复 支持 反对

使用道具 举报

发表于 2006-6-20 20:18:24 | 显示全部楼层
execl;execv;execle;execve;execlp;execvp;
前四个带路径;后两个带名字,在$PATH中寻找;

a中好象父进程变成了b,子程为a。
kill(pid, SIGUSR1)是不是给a发了信号,b根本没有接受到任何信号?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-21 15:15:23 | 显示全部楼层
但有时候b能工作,应该是收到信号了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-21 15:52:58 | 显示全部楼层
再次测试了一下,发现大概每执行5次a, b能正常工作一次,可以看到一次正确的结果
回复 支持 反对

使用道具 举报

发表于 2006-6-21 21:08:21 | 显示全部楼层
我觉得,你应该确保在父进程向子进程发送SIGUSER1之前,子进程已经调用了sigset函数。否则,子进程就会提前退出。当然你就看不到预期的效果。

这里有一个调度问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-22 11:04:29 | 显示全部楼层
母性人你这小子,呵呵,你也来了阿,虽然名字恶心了一点,但我觉得你把握了问题的关键,我试试看,谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-22 11:06:21 | 显示全部楼层
测试了,确实是muxingren说的情况,太谢谢了~
回复 支持 反对

使用道具 举报

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

本版积分规则

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