C 为什么父进程根本不执行?
下面是共享内存实现程序,其中父进程和子进程将使用共享内存打印父进程给定的下一个字母表 有一个共享内存,两个进程都连接到它以获得所需的结果。在我的代码中,父进程根本不执行C 为什么父进程根本不执行?,c,linux,operating-system,C,Linux,Operating System,下面是共享内存实现程序,其中父进程和子进程将使用共享内存打印父进程给定的下一个字母表 有一个共享内存,两个进程都连接到它以获得所需的结果。在我的代码中,父进程根本不执行 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<string.h> #include<sys/ipc.h> #include<sys/shm.h> #include<sy
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
int main(int argc,char *argv[])
{
int smid;
pid_t x;
char *sm;
smid=shmget(IPC_PRIVATE,(size_t)sizeof(char),IPC_CREAT);
x=fork();
if(x>0)
{
sm=(char *)shmat(smid,NULL,0);
sprintf(sm,"%s",argv[1]);
printf("Parent wrote:\n");
puts(sm);
sleep(4);
printf("Parent got:\n");
puts(sm);
shmdt(sm);
shmctl(smid,IPC_RMID,NULL);
}
else if(x==0)
{
sleep(2);
sm=(char *)shmat(smid,NULL,0);
printf("Child read:\n");
puts(sm);
sm[0]++;
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int-smid;
pid_t x;
字符*sm;
smid=shmget(IPC_PRIVATE,(size_t)sizeof(char),IPC_CREAT);
x=fork();
如果(x>0)
{
sm=(char*)shmat(smid,NULL,0);
sprintf(sm,“%s”,argv[1]);
printf(“父写入:\n”);
看跌期权(sm);
睡眠(4);
printf(“父对象得到:\n”);
看跌期权(sm);
shmdt(sm);
shmctl(smid,IPC_RMID,NULL);
}
else如果(x==0)
{
睡眠(2);
sm=(char*)shmat(smid,NULL,0);
printf(“子读取:\n”);
看跌期权(sm);
sm[0]++;
}
返回0;
}
您在程序中有未定义的行为。您为单个字符分配内存,然后使用strcpy,它很可能会复制多个字符(即使它复制一个字符,您也必须记住它也会复制字符串终止符,因此实际上会复制两个字符)
未定义的行为通常是导致崩溃的主要原因,这可能是代码中发生的情况。程序中存在未定义的行为。您为单个字符分配内存,然后使用strcpy,它很可能会复制多个字符(即使它复制一个字符,您也必须记住它也会复制字符串终止符,因此实际上会复制两个字符)
未定义的行为通常是导致崩溃的主要原因,这可能是代码中发生的情况。程序中存在未定义的行为。您为单个字符分配内存,然后使用strcpy,它很可能会复制多个字符(即使它复制一个字符,您也必须记住它也会复制字符串终止符,因此实际上会复制两个字符)
未定义的行为通常是导致崩溃的主要原因,这可能是代码中发生的情况。程序中存在未定义的行为。您为单个字符分配内存,然后使用strcpy,它很可能会复制多个字符(即使它复制一个字符,您也必须记住它也会复制字符串终止符,因此实际上会复制两个字符)
未定义的行为通常是导致崩溃的主要原因,这可能是您的代码中发生的情况。几乎就是导致此程序崩溃的原因
smid=shmget(IPC_PRIVATE,(size_t)sizeof(char),IPC_CREAT);
src被分配为单字节,但接下来是bizzare
char *src=(char *)malloc(sizeof(char));
strcpy(src,argv[0]); // argv[0] is more than 1
sm=(char *)shmat(smid,NULL,0);
sprintf(sm,"%s",src); // it has NULL at the end
松散固定程序
int smid;
pid_t x;
char *sm;
smid=shmget(IPC_PRIVATE,(size_t)120*sizeof(char),IPC_CREAT|0666); // permissions and size are important
perror("smid ");
x=fork();
if(x>0)
{
char *src=(char *)malloc(120*sizeof(char)); // size is the key here
sm=(char *)shmat(smid,NULL,0);
perror("shmat" );
strcpy(src,argv[0]);
sprintf(sm,"%s",src);
printf("Parent wrote:\n");
puts(sm);
sleep(4);
printf("Parent got:\n");
puts(sm);
shmdt(sm);
shmctl(smid,IPC_RMID,NULL);
}
else if(x==0)
{
sleep(2);
sm=(char *)shmat(smid,NULL,0);
printf("Child read:\n");
puts(sm);
sm[0]++;
}
几乎就是这个节目的原因
smid=shmget(IPC_PRIVATE,(size_t)sizeof(char),IPC_CREAT);
src被分配为单字节,但接下来是bizzare
char *src=(char *)malloc(sizeof(char));
strcpy(src,argv[0]); // argv[0] is more than 1
sm=(char *)shmat(smid,NULL,0);
sprintf(sm,"%s",src); // it has NULL at the end
松散固定程序
int smid;
pid_t x;
char *sm;
smid=shmget(IPC_PRIVATE,(size_t)120*sizeof(char),IPC_CREAT|0666); // permissions and size are important
perror("smid ");
x=fork();
if(x>0)
{
char *src=(char *)malloc(120*sizeof(char)); // size is the key here
sm=(char *)shmat(smid,NULL,0);
perror("shmat" );
strcpy(src,argv[0]);
sprintf(sm,"%s",src);
printf("Parent wrote:\n");
puts(sm);
sleep(4);
printf("Parent got:\n");
puts(sm);
shmdt(sm);
shmctl(smid,IPC_RMID,NULL);
}
else if(x==0)
{
sleep(2);
sm=(char *)shmat(smid,NULL,0);
printf("Child read:\n");
puts(sm);
sm[0]++;
}
几乎就是这个节目的原因
smid=shmget(IPC_PRIVATE,(size_t)sizeof(char),IPC_CREAT);
src被分配为单字节,但接下来是bizzare
char *src=(char *)malloc(sizeof(char));
strcpy(src,argv[0]); // argv[0] is more than 1
sm=(char *)shmat(smid,NULL,0);
sprintf(sm,"%s",src); // it has NULL at the end
松散固定程序
int smid;
pid_t x;
char *sm;
smid=shmget(IPC_PRIVATE,(size_t)120*sizeof(char),IPC_CREAT|0666); // permissions and size are important
perror("smid ");
x=fork();
if(x>0)
{
char *src=(char *)malloc(120*sizeof(char)); // size is the key here
sm=(char *)shmat(smid,NULL,0);
perror("shmat" );
strcpy(src,argv[0]);
sprintf(sm,"%s",src);
printf("Parent wrote:\n");
puts(sm);
sleep(4);
printf("Parent got:\n");
puts(sm);
shmdt(sm);
shmctl(smid,IPC_RMID,NULL);
}
else if(x==0)
{
sleep(2);
sm=(char *)shmat(smid,NULL,0);
printf("Child read:\n");
puts(sm);
sm[0]++;
}
几乎就是这个节目的原因
smid=shmget(IPC_PRIVATE,(size_t)sizeof(char),IPC_CREAT);
src被分配为单字节,但接下来是bizzare
char *src=(char *)malloc(sizeof(char));
strcpy(src,argv[0]); // argv[0] is more than 1
sm=(char *)shmat(smid,NULL,0);
sprintf(sm,"%s",src); // it has NULL at the end
松散固定程序
int smid;
pid_t x;
char *sm;
smid=shmget(IPC_PRIVATE,(size_t)120*sizeof(char),IPC_CREAT|0666); // permissions and size are important
perror("smid ");
x=fork();
if(x>0)
{
char *src=(char *)malloc(120*sizeof(char)); // size is the key here
sm=(char *)shmat(smid,NULL,0);
perror("shmat" );
strcpy(src,argv[0]);
sprintf(sm,"%s",src);
printf("Parent wrote:\n");
puts(sm);
sleep(4);
printf("Parent got:\n");
puts(sm);
shmdt(sm);
shmctl(smid,IPC_RMID,NULL);
}
else if(x==0)
{
sleep(2);
sm=(char *)shmat(smid,NULL,0);
printf("Child read:\n");
puts(sm);
sm[0]++;
}
结论性陈述没有帮助。你需要告诉我们你期望的产量和你得到的产量。或者,至少,您是如何得出父进程不执行的结论的。控件不会为父进程输入块。根本没有输出“父写入”或“父获取”。相反,它再次说“分段故障(堆芯倾倒)”,这是一个结论。你怎么会这么想?你有什么证据证明这个结论?你期待什么?你观察到了什么?我现在只能说使用gdb;在此崩溃“sprintf(sm,“%s”,argv[1]);”结论语句没有帮助。你需要告诉我们你期望的产量和你得到的产量。或者,至少,您是如何得出父进程不执行的结论的。控件不会为父进程输入块。根本没有输出“父写入”或“父获取”。相反,它再次说“分段故障(堆芯倾倒)”,这是一个结论。你怎么会这么想?你有什么证据证明这个结论?你期待什么?你观察到了什么?我现在只能说使用gdb;在此崩溃“sprintf(sm,“%s”,argv[1]);”结论语句没有帮助。你需要告诉我们你期望的产量和你得到的产量。或者,至少,您是如何得出父进程不执行的结论的。控件不会为父进程输入块。根本没有输出“父写入”或“父获取”。相反,它再次说“分段故障(堆芯倾倒)”,这是一个结论。你怎么会这么想?你有什么证据证明这个结论?你期待什么?你观察到了什么?我现在只能说使用gdb;在此崩溃“sprintf(sm,“%s”,argv[1]);”结论语句没有帮助。你需要告诉我们你期望的产量和你得到的产量。或者,至少,您是如何得出父进程不执行的结论的。控件不会为父进程输入块。根本没有输出“父写入”或“父获取”。相反,它再次说“分段故障(堆芯倾倒)”,这是一个结论。你怎么会这么想?你有什么证据证明这个结论?你期待什么?你观察到了什么?我现在只能说使用gdb;在此崩溃“sprintf(sm,“%s”,argv[1]);“对不起,我更改了代码。现在是argv[1],我不再使用src了。我在sprintf中直接传递argv[1],而不是src。非常感谢。这解决了我的问题。非常感谢。这解决了我的问题。对不起,我更改了代码。现在是argv[1],我不再使用src了。我在sprintf中直接传递argv[1],而不是src。非常感谢。这解决了我的问题。非常感谢