system()是否在内部执行类似sem_post的调用?

Does system() do a call like sem_post inside?

本文关键字:sem post 调用 是否 在内部 执行 system      更新时间:2023-10-16

我想我的代码不会打印文本

哦,为什么来这里! n

但是它有

是有什么"错误"与system() ?因为,当我删除它时,代码按照我想要的方式运行,停止了。

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
pthread_t id0, id1;
sem_t sp; 
void *fun0(void *) {
    // When erasing the following line "system("");",
    // it block up, and doesn't print "oh why come here!n".
    // But with it, it print the text!
    system("");
    return NULL;
}
void *fun1(void *) {
    sem_wait(&sp);
    fprintf(stderr, "oh why come here!n");
    return NULL;
}
int main() {
    sem_init(&sp, 0, 0); 
    pthread_create(&id0, 0, fun0, NULL);
    pthread_create(&id1, 0, fun1, NULL);
    void *stat0, *stat1;
    pthread_join(id0, &stat0);
    pthread_join(id1, &stat1);
    return 0;
}

编译器:gcc 4.1.2Linux kernel: 2.6.18


我用gcc 4.6.3,内核3.2.0编译它,它也像我想要的那样运行。所以我认为这是因为gcc 4.1.2或内核2.6.18。

system()调用与此无关。我的灵媒告诉我,sem_wait失败了,出现了一个错误代码,而不是等待检查返回值。例如,我可以在Mac OS X上重现您的结果,因为在Mac OS X上,sem_init()总是与ENOSYS("功能未实现")一起失败,这导致对sem_wait的调用随后与EBADF("错误的文件描述符")一起失败。

如果你添加一些错误检查,你会看到出错的地方:

if(sem_init(&sp, 0, 0) < 0)
    fprintf(stderr, "sem_init failed: %sn", strerror(errno));
...
if(sem_wait(&sp) < 0)
    fprintf(stderr, "sem_wait failed: %sn", strerror(errno));

您还应该提高编译器上的警告级别——如果您想捕获更多可能出现的问题,我绝对推荐使用-Wall-Wextra -pedantic。目前,您的代码调用未定义的行为,因为无法从fun0fun1函数返回值,而-Wall会警告您。这种错误在x86上可能不会引起任何明显的问题,但在其他架构(如IA64)上,未初始化的垃圾可能是致命的。

你的代码的问题是sem_wait(),从sem_wait手册页,它说:

"sem_wait()减少(锁定)sem指向的信号量。如果信号量的值大于零,则继续递减,函数立即返回。如果信号量当前的值为零,则调用阻塞,直到可以执行减量(即,信号量值上升到零以上),或者信号处理程序中断调用。"

在你的代码中,你用0初始化sp,当sem_wait()递减时,它阻塞并且永远不会返回,因为没有其他线程增加sp变量