C 我的pid标识符不是预期的
所以在学校我做了这个练习,我需要做一个程序来计算一个数字是否是素数。此程序应使用父进程和子进程,并且应使用strtoul将argv转换为无符号longC 我的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
#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失败了!”);
}
否则{
智力状态