我的pid标识符没有预料到

时间:2017-11-29 14:18:33

标签: c compilation fork pid

所以对于学校我得到了这个练习,我需要制作一个程序,计算一个数字是否是素数。该程序应该使用父进程和子进程,并且应该使用strtoul将argv转换为unsigned long。

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>

void checkprime(unsigned long num);

int main(int argc, char *argv, char *env)
{       
strtoul(argv, NULL, 0);

pid_t pid = fork(); 

if(pid == 0)
{
    unsigned long number;

    printf("\nGive number to check: \n");
    scanf("%lu",&number);

    checkprime(number);
}
else if(pid < 0)
{
    perror("Fork Failed!");
}
else
{
    int status = -1, result;
    waitpid(pid, &status, 0);
    result = WEXITSTATUS(status);

    if(result == 1)
    {       
        printf("this is a prime number\n");
    }
    else if(status < 0)
    {
        perror("Something Failed");
    }
    else
    { 
        printf("this is not a prime number\n");
    }
}
return 0;
}

void checkprime(unsigned long num)
{
int i;
for(i = 2; i < num; i++)
{
    if(num % i == 0)
    {
        exit(0);
    }
}
exit(1);
}

所以当我尝试编译它时,它说:第13行:标识符不是预期的。错误代码1。

第13行的代码说:pid_t pid = fork();

现在我的问题是:为什么我会收到这个错误?

它已修复,感谢大家的帮助。我很感激。

3 个答案:

答案 0 :(得分:2)

某些旧版本的编译器接受C89(不是C99C11)作为默认C语言。你想要C99(因为你在声明后有声明)。

如果您在某些旧的Linux发行版上使用某些旧版本的GCC,请尝试编译with gcc -std=gnu99 -Wall -Wextra -g,其中-std=gnu99设置C方言(您也可以使用{{} 1}}或更好),-std=c99请求警告,-Wall -Wextra需要调试信息(在DWARF中为gdb debugger)。更好的是,将您的GCC升级到最近的版本(如2017年11月的GCC 7),其默认值为C11 GNU extensions

或者发表声明

-g

(我更喜欢在C中系统地初始化变量)

在陈述之前

pid_t pid= 0;

答案 1 :(得分:0)

编译器告诉您它不希望在该行遇到标识符pid_t,因为上一行不是标识符。您需要在范围的顶部声明变量,并将其他代码放在其下面。你可以这样做

int main(int argc, char *argv, char *env)
{       
    long int val=strtoul(argv, NULL, 0);
    pid_t pid = fork(); 
    ...

int main(int argc, char *argv, char *env)
{       
    pid_t pid = fork(); 
    strtoul(argv, NULL, 0);
    ...

但是你错过了从strtol

返回的值

答案 2 :(得分:0)

您可以通过将i < num更改为i < num/2来使用make short prime finder循环。

这是main()参数的标准之一:

  

(int argc,char ** argv)

启用gcc标志:-Wall以查看代码中的所有警告。

正如@cleblanc在其中一个答案中所述,将strtoul()的返回值存储到变量long int val = strtoul(argv[1], NULL, 0);

我们从命令行参数传递数字进行检查, argv[1]是指我们使用

运行程序时的数字
  

./ prime 15

<强> 代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void checkprime(unsigned long num);

int main(int argc, char **argv)
{ 

    long int val = strtoul(argv[1], NULL, 0);

    pid_t pid = fork(); 

    if(pid == 0){   
        checkprime(val);
    }
    else if(pid < 0){
        perror("Fork Failed!");
    }
    else{
        int status = -1, result;
        waitpid(pid, &status, 0);
        result = WEXITSTATUS(status);
        if(result == 1){       
            printf("Prime\n");
        }
        else if(status < 0){
            perror("Something Failed");
        }
        else{ 
            printf("Not prime\n");
        }
    }
    return 0;
}

void checkprime(unsigned long num)
{
    int i;
    for(i = 2; i < num/2; i++){
        if(num % i == 0){
            exit(0);
        }
    }
    exit(1);
}
  

编译,运行

gcc -Wall prime.c -o prime

./prime 15