Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我的pid标识符不是预期的_C_Compilation_Fork_Pid - Fatal编程技术网

C 我的pid标识符不是预期的

C 我的pid标识符不是预期的,c,compilation,fork,pid,C,Compilation,Fork,Pid,所以在学校我做了这个练习,我需要做一个程序来计算一个数字是否是素数。此程序应使用父进程和子进程,并且应使用strtoul将argv转换为无符号long #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/wait.h> #include<unistd.h> void checkprime(unsigned long num); int mai

所以在学校我做了这个练习,我需要做一个程序来计算一个数字是否是素数。此程序应使用父进程和子进程,并且应使用strtoul将argv转换为无符号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);
}
#包括
#包括
#包括
#包括
#包括
void checkprime(无符号长数值);
int main(int argc、char*argv、char*env)
{       
strtoul(argv,NULL,0);
pid_t pid=fork();
如果(pid==0)
{
无符号长数;
printf(“\n要检查的活动编号:\n”);
scanf(“%lu”、&number);
校验素数;
}
否则如果(pid<0)
{
佩罗尔(“Fork失败了!”);
}
其他的
{
int status=-1,结果;
waitpid(pid和status,0);
结果=WEXITSTATUS(状态);
如果(结果==1)
{       
printf(“这是一个素数\n”);
}
否则如果(状态<0)
{
佩罗尔(“失败的事情”);
}
其他的
{ 
printf(“这不是质数\n”);
}
}
返回0;
}
void checkprime(无符号长数值)
{
int i;
对于(i=2;i
所以当我试图编译它时,它说:第13行:标识符不是预期的。错误代码1

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

现在我的问题是:为什么我会犯这样的错误


已经修好了,谢谢大家的帮助。非常感谢。

编译器告诉您,由于前一行不是标识符,因此它不希望在该行遇到标识符
pid\t
。您需要在作用域的顶部声明变量,并将其他代码放在该作用域的下面。你可以这样做

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


但是您丢失了从strtol返回的值,编译器告诉您它不希望在该行遇到标识符,因为前一行不是标识符。您需要在作用域的顶部声明变量,并将其他代码放在该作用域的下面。你可以这样做

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


但是您缺少从strtol返回的值,一些旧版本的编译器接受(不是或)作为默认的C方言。您至少需要C99(因为在语句之后有一个声明)

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

或者把申报单

pid_t pid= 0;
(我更喜欢用C系统地初始化变量)

在发言之前

 strtoul(argv, NULL, 0); //useless call, you need to store the result
 pid= fork(); 

一些旧版本的编译器接受(不是或)作为默认的C方言。您至少需要C99(因为在语句之后有一个声明)

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

或者把申报单

pid_t pid= 0;
(我更喜欢用C系统地初始化变量)

在发言之前

 strtoul(argv, NULL, 0); //useless call, you need to store the result
 pid= fork(); 

通过将,
i
更改为
i
,可以使用make shorter prime finder循环

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

(整数argc,字符**argv)

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

如答案之一所述,将
strtoul()
的返回值存储到变量
long int val=strtoul(argv[1],NULL,0)

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

/首相15

代码

#包括
#包括
#包括
#包括
#包括
void checkprime(无符号长数值);
int main(int argc,字符**argv)
{ 
long int val=strtoul(argv[1],NULL,0);
pid_t pid=fork();
如果(pid==0){
校验素数(val);
}
否则如果(pid<0){
佩罗尔(“Fork失败了!”);
}
否则{
int status=-1,结果;
waitpid(pid和status,0);
结果=WEXITSTATUS(状态);
如果(结果==1){
printf(“Prime\n”);
}
否则如果(状态<0){
佩罗尔(“失败的事情”);
}
否则{
printf(“非素数”);
}
}
返回0;
}
void checkprime(无符号长数值)
{
int i;
对于(i=2;i
编译,运行

gcc-Wall prime.c-o prime


/prime 15
您可以通过将
i
更改为
i
来使用make shorter prime finder循环

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

(整数argc,字符**argv)

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

如答案之一所述,将
strtoul()
的返回值存储到变量
long int val=strtoul(argv[1],NULL,0)

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

/首相15

代码

#包括
#包括
#包括
#包括
#包括
void checkprime(无符号长数值);
int main(int argc,字符**argv)
{ 
long int val=strtoul(argv[1],NULL,0);
pid_t pid=fork();
如果(pid==0){
校验素数(val);
}
否则如果(pid<0){
佩罗尔(“Fork失败了!”);
}
否则{
智力状态